Pagini recente » Cod sursa (job #3211455) | Cod sursa (job #2567907) | Cod sursa (job #668498) | Cod sursa (job #3262924) | Cod sursa (job #2759198)
#include <fstream>
#include <string>
#include <stack>
#include <cmath>
using namespace std;
int precedence(char op){
switch(op){
case '^':
return 3;
break;
case '*':
return 2;
break;
case '/':
return 2;
break;
case '+':
return 1;
break;
case '-':
return 1;
break;
default:
return 0;
break;
}
}
void eval(stack<int>& calc, char op){
int a = calc.top(); calc.pop();
int b = calc.top(); calc.pop();
int result;
switch (op)
{
case '^':
result = (int)pow(a, b);
break;
case '*':
result = a * b;
break;
case '/':
result = b / a;
break;
case '+':
result = a + b;
break;
case '-':
result = b - a;
break;
default:
break;
}
calc.push(result);
}
int main(){
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
string expr;
cin >> expr;
stack<int> calc;
stack<char> postfix;
for(int i = 0; i < expr.length(); ++i){
if(expr[i] >= '0' && expr[i] <= '9'){
int number = 0;
while(expr[i] >= '0' && expr[i] <= '9' && i < expr.length()){
number = number * 10 + expr[i] - '0';
++i;
}
--i;
calc.push(number);
}
else if(expr[i] == '(')
postfix.push(expr[i]);
else if(expr[i] == ')'){
while(postfix.top() != '('){
eval(calc, postfix.top());
postfix.pop();
}
postfix.pop();
}
else{
while(!postfix.empty() && precedence(expr[i]) <= precedence(postfix.top())){
eval(calc, postfix.top());
postfix.pop();
}
postfix.push(expr[i]);
}
}
while(!postfix.empty()){
eval(calc, postfix.top());
postfix.pop();
}
cout << calc.top();
cin.close();
cout.close();
return 0;
}