Pagini recente » Cod sursa (job #616055) | Cod sursa (job #1449597) | Cod sursa (job #2388688) | Cod sursa (job #501152) | Cod sursa (job #2767653)
#include <fstream>
#include <stack>
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
int degree(char op)
{
if(op == '+' or op == '-')
return 1;
if(op == '*' or op == '/')
return 2;
return 0;
}
int calculateOperation(int a, int b, char op)
{
if(op == '+') return a+b;
else
if(op == '-') return a-b;
else if(op == '/') return a/b;
else if(op == '*') return a*b;
}
int evaluate(string e)
{
stack<int> values;
stack<char> op;
for ( int i = 0; i < e.size(); ++i)
{
if(e[i] == ' ')
continue;
else if(e[i] == '(')
{
op.push(e[i]);
}
else if(e[i] >= '0' and e[i] <= '9')
{
int val = 0;
while(i < e.size() and e[i] >= '0' and e[i] <= '9')
{
val = val * 10 + e[i] - '0';
++i;
}
values.push(val);
--i;
}
else if(e[i] == ')')
{
while(op.size() > 0 and op.top() != '(')
{
int val2 = values.top();
values.pop();
int val1 = values.top();
values.pop();
char operation = op.top();
op.pop();
values.push(calculateOperation(val1,val2,operation));
}
if(op.size() > 0) // (
op.pop();
}
//operatie
else
{
while(op.size() >0 and degree(op.top()) >= degree(e[i]))
{
int val2 = values.top();
values.pop();
int val1 = values.top();
values.pop();
char operation = op.top();
op.pop();
values.push(calculateOperation(val1,val2,operation));
}
op.push(e[i]);
}
} //inchid forul de parcuregerfe al lui e
while(op.size() > 0)
{
int val2 = values.top();
values.pop();
int val1 = values.top();
values.pop();
char operation = op.top();
op.pop();
values.push(calculateOperation(val1,val2,operation));
}
int ans = values.top();
values.pop();
return ans;
}
int main()
{
string a;
cin >> a;
cout << evaluate(a);
}