Pagini recente » Cod sursa (job #1876721) | Cod sursa (job #1531725) | Cod sursa (job #2187869) | Cod sursa (job #2752756) | Cod sursa (job #2864736)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int prioritate(char op)
{ if(op == '+'||op == '-')
return 1;
if(op == '*'||op == '/')
return 2;
return 0;
}
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;
}
}
int evaluare(string tokens)
{ stack<int>values;
stack<char>ops;
for(int i = 0; i < tokens.length(); 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);
}
else if(tokens[i] == ')')
{ while(!ops.empty() && ops.top() != '(')
{ int val2 = values.top();
values.pop();
int val1 = values.top();
values.pop();
char op = ops.top();
ops.pop();
values.push(operatie(val1, val2, op));
}
if(!ops.empty())
ops.pop();
}
else
{ while(!ops.empty() && prioritate(ops.top()) >= prioritate(tokens[i]))
{ int val2 = values.top();
values.pop();
int val1 = values.top();
values.pop();
char op = ops.top();
ops.pop();
values.push(operatie(val1, val2, op));
}
ops.push(tokens[i]);
}
}
while(!ops.empty())
{ int val2 = values.top();
values.pop();
int val1 = values.top();
values.pop();
char op = ops.top();
ops.pop();
values.push(operatie(val1, val2, op));
}
return values.top();
}
int main()
{ string expresie;
fin >> expresie;
fout << evaluare(expresie);
fout.close();
}