Pagini recente » Cod sursa (job #523131) | Cod sursa (job #2584822) | Cod sursa (job #778363) | Cod sursa (job #2923127) | Cod sursa (job #3274260)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int operatie(int a, int b, char op)
{
switch(op)
{
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
//default: return 0;
}
}
int ordine(char op)
{
if(op == '+' || op == '-')
return 1;
if(op == '*' || op == '/')
return 2;
return 0;
}
int eval(string s)
{
stack<int> nr;
stack<char> ops;
for(int i = 0; i < s.size(); i++)
{
if(s[i] == ' ') continue;
if (isdigit(s[i]))
{
int val = 0;
while(i < s.size() && isdigit(s[i]))
val = 10 * val + (s[i++] - '0');
nr.push(val);
i--;
}
else if(s[i] == '(')
ops.push(s[i]);
else if(s[i] == ')')
{
while(!ops.empty() && ops.top() != '(')
{
int b = nr.top(); nr.pop();
int a = nr.top(); nr.pop();
char op = ops.top(); ops.pop();
nr.push(operatie(a, b, op));
}
ops.pop();
}
else if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
{
while(!ops.empty() && ordine(ops.top()) >= ordine(s[i]))
{
int b = nr.top();
nr.pop();
int a = nr.top();
nr.pop();
char op = ops.top();
ops.pop();
nr.push(operatie(a, b, op));
}
ops.push(s[i]);
}
}
while(!ops.empty())
{
int b = nr.top();
nr.pop();
int a = nr.top();
nr.pop();
char op = ops.top();
ops.pop();
nr.push(operatie(a, b, op));
}
return nr.top();
}
signed main()
{
string s;
fin >> s;
fout << eval(s);
return 0;
}