Cod sursa(job #567283)

Utilizator bacilaBacila Emilian bacila Data 29 martie 2011 22:00:40
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb

#include<fstream>
#include<cmath>
#include<stack>
using namespace std;
stack<char> p;
stack<int> r;
char s[100010],pol[100010];
int i,k,x;
int main()
{ifstream f("evaluare.in");
    f.getline(s,100010);
    f.close();
    p.push(-1);
    for(i=0;s[i];i++)
    {if(isdigit(s[i]))
    {while(isdigit(s[i]))
    {pol[k++]=s[i];i++;}
    pol[k++]='x';}
    if(s[i]=='(')
    p.push('(');
    else
    if(s[i]=='*'||s[i]=='/')
    {
    if(p.top()=='/'||p.top()=='*')
    {pol[k++]=p.top();
    p.pop();} 
    p.push(s[i]);}
    else
    if(s[i]=='+'||s[i]=='-')
    {while(p.top()!='('&&p.top()!=-1)
    {pol[k++]=p.top();
    p.pop();}
    p.push(s[i]);}
    else
    if(s[i]==')')
    {while(p.top()!='(')
    {pol[k++]=p.top();
    p.pop();}
    p.pop();}
    }
    
    while(p.top()!=-1)
    {pol[k++]=p.top();
    p.pop();}
    r.push(0);
    r.push(0);
    for(i=0;pol[i];i++)
    {if(isdigit(pol[i]))
     {x=0;
     while(isdigit(pol[i])){
     x=x*10+(pol[i]-'0');i++;}
     
     r.push(x);
     }
     
     if(pol[i]!='x')
     {x=r.top(); r.pop(); 
     if(pol[i]=='+') r.top()+=x;
     else
     if(pol[i]=='-') r.top()-=x;
     else
     if(pol[i]=='*') r.top()*=x;
     else
     r.top()/=x;
     }}
     ofstream g("evaluare.out");
     g<<r.top();
    g.close();
}