Cod sursa(job #694447)

Utilizator bacilaBacila Emilian bacila Data 27 februarie 2012 21:05:31
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.58 kb
#include <fstream>
#include <stack>
using namespace std;
stack<int> nr;
stack<char> op;
char s[100003];
int i,n1,n2;
int main ()
{ifstream f("evaluare.in");
 ofstream g("evaluare.out");
f.getline(s,100002);
nr.push(0);
op.push(0);
for(i=0;s[i];i++)
{
                 if('0'<=s[i]&&s[i]<='9'){
                 while('0'<=s[i]&&s[i]<='9')
                 {n1=n1*10+s[i]-'0'; i++;}
                 nr.push(n1);
                 n1=0;
                 i--;
                 }
                 
                 else
                 if(s[i]=='+'||s[i]=='-')
                 {while(op.top()=='+'||op.top()=='-'||op.top()=='*'||op.top()=='/')
                 if(op.top()=='+')
                 {n2=nr.top();
                 nr.pop();
                 nr.top()+=n2;
                 op.pop();}
                 else
                 if(op.top()=='-')
                 {n2=nr.top();
                 nr.pop();
                 nr.top()-=n2;
                 op.pop();}
                 else
                 if(op.top()=='*')
                 {n2=nr.top();
                 nr.pop();
                 nr.top()*=n2;
                 op.pop();}
                 else
                 if(op.top()=='/')
                 {n2=nr.top();
                 nr.pop();
                 nr.top()/=n2;
                 op.pop();}
                 op.push(s[i]);
                 }
                 
                 else
                 if(s[i]=='*'||s[i]=='/')
                 {if(op.top()=='*')
                 {n2=nr.top();
                 nr.pop();
                 nr.top()*=n2;
                 op.pop();}
                 else
                 if(op.top()=='/')
                 {n2=nr.top();
                 nr.pop();
                 nr.top()/=n2;
                 op.pop();}
                 op.push(s[i]);
                 }
                 
                 else
                 if(s[i]==')')
                 {while(op.top()!='(')
                 if(op.top()=='+')
                 {n2=nr.top();
                 nr.pop();
                 nr.top()+=n2;
                 op.pop();}
                 else
                 if(op.top()=='-')
                 {n2=nr.top();
                 nr.pop();
                 nr.top()-=n2;
                 op.pop();}
                 else
                 if(op.top()=='*')
                 {n2=nr.top();
                 nr.pop();
                 nr.top()*=n2;
                 op.pop();}
                 else
                 if(op.top()=='/')
                 {n2=nr.top();
                 nr.pop();
                 nr.top()/=n2;
                 op.pop();}
                 op.pop();}
                 
                 
                 
                 else
                 op.push('(');
}

while(op.top()!=0)
{
                  if(op.top()=='+')
                 {n2=nr.top();
                 nr.pop();
                 nr.top()+=n2;
                 op.pop();}
                 else
                 if(op.top()=='-')
                 {n2=nr.top();
                 nr.pop();
                 nr.top()-=n2;
                 op.pop();}
                 else
                 if(op.top()=='*')
                 {n2=nr.top();
                 nr.pop();
                 nr.top()*=n2;
                 op.pop();}
                 else
                 if(op.top()=='/')
                 {n2=nr.top();
                 nr.pop();
                 nr.top()/=n2;
                 op.pop();}
                 
}
    g<<nr.top();              
 f.close(); g.close();
return 0;
}