Pagini recente » Cod sursa (job #1969190) | Cod sursa (job #1892627) | Cod sursa (job #2509977) | Cod sursa (job #1921701) | Cod sursa (job #2872321)
#include <fstream>
#include <iostream>
#include <stack>
#include <cctype>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int precedence(char op)
{
if (op=='+' || op=='-')
return 1;
else if (op=='/' || op=='*')
return 2;
return 0;
}
int applyOp(int a,int b,char op)
{
switch (op)
{
case '+':
return a+b;
case '-':
return a-b;
case '/':
return a/b;
case '*':
return a*b;
}
return 0;
}
int evaluate (string tokens)
{
stack <int> values;
stack <char> ops;
for (int i=0; i<tokens.length(); i++)
{
// cout<<i<<' ';
if (tokens[i]==' ')
continue;
else if (tokens[i]=='(')
ops.push(tokens[i]);
else if (isdigit(tokens[i]))
{
int val=0;
while (i<tokens.length() && isdigit(tokens[i]))
{
val=val*10+(tokens[i]-'0');
i++;
}
values.push(val);
i--;
// cout<<val<<'\n';
}
else if (tokens[i]==')')
{
while (!ops.empty() && ops.top()!='(')
{
int val2=values.top();
values.pop();
// cout<<val2<<' ';
int val1=values.top();
//cout<<val1<<' ';
values.pop();
char op=ops.top();
ops.pop();
values.push(applyOp(val1,val2,op));
}
if (!ops.empty())
ops.pop();
}
else
{
while (!ops.empty() && precedence(ops.top())>=precedence(tokens[i]))
{
int val2=values.top();
values.pop();
int val1=values.top();
values.pop();
char op=ops.top();
ops.pop();
values.push(applyOp(val1,val2,op));
}
ops.push(tokens[i]);
}
// cout<<'\n';
}
while (!ops.empty())
{
int val2=values.top();
values.pop();
int val1=values.top();
values.pop();
char op=ops.top();
ops.pop();
values.push(applyOp(val1,val2,op));
}
return values.top();
}
string expr;
int main()
{
fin>>expr;
// cout<<expr;
fout<<evaluate(expr);
return 0;
}