Pagini recente » Cod sursa (job #1669130) | Cod sursa (job #3249520) | Cod sursa (job #1296577) | Cod sursa (job #2699650) | Cod sursa (job #2115670)
#include <fstream>
#include <string.h>
#include <stack>
#include <queue>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char s[100001];
int k;
queue <int>expresie;
stack <pair<char,int> >semn;
stack <int>rez;
int semn1(char sem)
{
if(sem=='+')
return 1;
if(sem=='-')
return 1;
if(sem=='*')
return 2;
if(sem=='/')
return 2;
return 0;
}
int semn2(char sem)
{
if(sem=='+')
return -1;
else if(sem=='-')
return -2;
else if(sem=='*')
return -3;
else if(sem=='/')
return -4;
return 0;
}
int main()
{
fin>>s;
for(int i=0; i<strlen(s); i++)
{
if(isdigit(s[i]))
{
int c=0;
while(isdigit(s[i]))
{
c=c*10+s[i]-'0';
i++;
}
expresie.push(c);
}
if(semn1(s[i])>0)
{
while(!semn.empty()&&(semn1(s[i])+k<=semn.top().second))
{
expresie.push(semn2(semn.top().first));
semn.pop();
}
semn.push({s[i],semn1(s[i])+k});
}
if(s[i]=='(')
k+=2;
if(s[i]==')')
k-=2;
}
while(!semn.empty())
{
expresie.push(semn2(semn.top().first));
semn.pop();
}
while(!expresie.empty())
{
if(expresie.front()>=0)
{
rez.push(expresie.front());
expresie.pop();
}
else
{
int a=rez.top();
rez.pop();
int b=rez.top();
rez.pop();
if(expresie.front()==-1)
rez.push(b+a);
if(expresie.front()==-2)
rez.push(b-a);
if(expresie.front()==-3)
rez.push(b*a);
if(expresie.front()==-4)
rez.push(b/a);
expresie.pop();
}
}
fout<<rez.top();
return 0;
}