Pagini recente » Cod sursa (job #719598) | Cod sursa (job #3228446) | Cod sursa (job #656981) | Cod sursa (job #2602744) | Cod sursa (job #2063493)
#include <iostream>
#include <fstream>
#include <stack>
#include <queue>
#include <string.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char s[100009],oper[]="+-*/)(";
int pr[300],a;
int i,l;
struct elem{
int tip;
int val;
}c;
stack <char> op;
queue <elem> fp;
stack <int> nr;
int main()
{
fin>>s;
l=strlen(s);
for(i=l-1;i>=0;i--)
s[i+1]=s[i];
l+=2;
s[0]='(';
s[l-1]=')';
pr['(']=pr[')']=0;
pr['+']=pr['-']=1;
pr['*']=pr['/']=2;
for(i=0;i<=l-1;i++)
{
if(s[i]=='['||s[i]=='{')s[i]='(';
if(s[i]==']'||s[i]=='}')s[i]=')';
}
i=0;
while(s[i]=='(')
op.push(s[i++]);
for(i=i;i<=l-1;i++)
{
if(strchr(oper,s[i]))
{ if(s[i]!='(')
while(pr[s[i]]<pr[op.top()])
{
switch(op.top())
{
case '+': c.tip=1;break;
case '-': c.tip=2;break;
case '*': c.tip=3;break;
case '/': c.tip=4;break;
}fp.push(c);
op.pop();
}
if(s[i]==')')op.pop();
else
op.push(s[i]);
}
else
{
a=0;
while(s[i]>='0'&&s[i]<='9')
{
a=a*10+s[i]-'0';
i++;
}c.tip=0;
c.val=a;
fp.push(c);i--;
}
}
/* while(!fp.empty())
{ if(fp.front().tip==0)
fout<<fp.front().val;
else switch(fp.front().tip){
case 1: fout<<"+";break;
case 2: fout<<"-";break;
case 3: fout<<"*";break;
case 4: fout<<"/";break;
}
// 2 3 5 * + 4 * 6 + 2 /
fout<<" ";
fp.pop();
}*/
while(!fp.empty())
{
if(fp.front().tip==0)
{
nr.push(fp.front().val);
fp.pop();
}
else
{a=nr.top();nr.pop();
switch(fp.front().tip){
case 1: a+=nr.top();nr.pop();nr.push(a);break;
case 2: a-=nr.top();a=-a;nr.pop();nr.push(a);break;
case 3: a*=nr.top();nr.pop();nr.push(a);break;
case 4: a=nr.top()/a;nr.pop();nr.push(a);break;
}
fp.pop();
}
}
fout<<nr.top();
return 0;
}