Pagini recente » Cod sursa (job #1588459) | Cod sursa (job #2604099) | Cod sursa (job #210989) | Cod sursa (job #1822475) | Cod sursa (job #1364188)
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;
char c[100005];
stack<int> S2;
stack<pair<char,int> > S1;
int N;
void Read()
{
scanf("%s",c+2);
c[0] = '#';
c[1] = '(';
N = strlen(c + 1);
c[N + 1] = ')';
c[N + 2] = 0;
++N;
}
int prio(char c)
{
if(c == '+' || c == '-')
return 1;
if(c == '*' || c == '/')
return 2;
}
void Scoate(int k)
{
int rez = 0,x,y;
while( (S1.top().first != '(' && c[k] ==')') || S1.top().second >= prio(c[k]))
{
y = S2.top(); S2.pop();
x = S2.top(); S2.pop();
if(S1.top().first == '+')
S2.push(x+y);
else
if(S1.top().first == '-')
S2.push(x-y);
else
if(S1.top().first == '*')
S2.push(x*y);
else
S2.push(x/y);
S1.pop();
}
}
void Dijkstra2S()
{
for(int i = 1; i <= N; ++i)
{
if(c[i] == '(')
{
S1.push(make_pair('(',-1));
continue;
}
if('0' <= c[i] && c[i] <= '9'){
int x = c[i] - 48;;
while('0' <= c[i+1] && c[i+1] <= '9'){
++i;
x = x * 10 + c[i] - 48;
}
S2.push(x);
continue;
}
if(c[i] == ')')
{
Scoate(i);
S1.pop();/// scoatem '('
continue;
}
Scoate(i);
S1.push(make_pair(c[i],prio(c[i])));
}
printf("%d\n",S2.top());
}
int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
Read();
Dijkstra2S();
return 0;
}