Pagini recente » Cod sursa (job #982767) | Cod sursa (job #2236606) | Cod sursa (job #1453879) | Cod sursa (job #742283) | Cod sursa (job #1751164)
#include <iostream>
#include<stack>
#include<math.h>
#include<string.h>
using namespace std;
stack<char> operators;
stack<int> factors;
void afiseaza(stack<int> v){
while(!v.empty()){
int a=v.top();
v.pop();
cout<<a<<" ";
}
cout<<endl;
}
void solve_op_prcedence(){
while(!operators.empty()&&(operators.top()=='*'||operators.top()=='/')){
char op=operators.top();
operators.pop();
int f1=factors.top();
factors.pop();
int f2=factors.top();
factors.pop();
switch(op){
case '*':factors.push(f1*f2);break;
case '/':factors.push(f2/f1);
}
}
}
void solve_op_bracket(){
while(operators.top()!='('){
char op=operators.top();
operators.pop();
int f1=factors.top();
factors.pop();
int f2=factors.top();
factors.pop();
switch(op){
case '*':factors.push(f1*f2);break;
case '/':factors.push(f2/f1);break;
case '+':factors.push(f1+f2);break;
}
}
operators.pop();
}
void solve_rest(){
while(!operators.empty()){
char op=operators.top();
operators.pop();
int f1=factors.top();
factors.pop();
int f2=factors.top();
factors.pop();
switch(op){
case '*':factors.push(f1*f2);break;
case '/':factors.push(f2/f1);break;
case '+':factors.push(f1+f2);break;
}
}
}
int main() {
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
char* w=(char*)malloc(100000);
cin>>w;
int j,last=0,opened=0;
for(int i=0;i<strlen(w);i++){
//cout<<w[i]<<" "<<i<<endl;
//afiseaza(factors);
switch(w[i]){
case '*':operators.push(w[i]);break;
case '/':operators.push(w[i]);break;
case '+':
if(!operators.empty())
if((operators.top()=='*'||operators.top()=='/'))solve_op_prcedence();
operators.push(w[i]);break;
case '-':
if(!operators.empty()&&(operators.top()=='*'||operators.top()=='/'))solve_op_prcedence();
operators.push('+');last=1;break;
case '(':if(last==1)opened++;operators.push(w[i]);break;
case ')':opened--;last=opened%2==0?0:1;
solve_op_bracket();break;
default:
int n=(w[i]-'0');
for(j=i+1;j<strlen(w);j++){
if(w[j]!='*'&&w[j]!='/'&&w[j]!='+'&&w[j]!='-'&&w[j]!='('&&w[j]!=')'){
n=n*10+(w[j]-'0');
}
else{
break;
}
}
i=j-1;
if(last==1&&opened%2==1){
n=-n;
}else if(last==1&&opened==0){
last=0;
n=-n;
}
factors.push(n);
}
}
solve_rest();
afiseaza(factors);
}