Cod sursa(job #1202589)

Utilizator nacrocRadu C nacroc Data 28 iunie 2014 16:39:20
Problema Evaluarea unei expresii Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include<stdio.h>
#include<stack>
#include<queue>
using namespace std;
queue<int> q;
stack<int> init;
stack<int> fin;
int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    char c;
    int a,b,nr;
    while(scanf("%c",&c)!='\n')
    {
        if(c=='\n')
        break;
        if(c>47 && c<58)
        {
            nr=0;
            while(c>47 && c<58)
            {
                nr=nr*10+(int(c)-'0');
                scanf("%c",&c);
            }
            q.push(nr);
        }
        if(c=='(')
        init.push(-1);
        if(c==')')
        {
            while(init.top()!=-1)
            {
                q.push(init.top());
                init.pop();
            }
            init.pop();
        }
        while(!init.empty() && (init.top()==-5 || init.top()==-6))
        {
            q.push(init.top());
            init.pop();
        }
        if(c=='+')
        init.push(-3);
        if(c=='-')
        init.push(-4);
        if(c=='*')
        init.push(-5);
        if(c=='/')
        init.push(-6);
    }
    while(!init.empty())
    {
        q.push(init.top());
        init.pop();
    }
    while(!q.empty())
    {
        if(q.front()>=-2)
        {
            fin.push(q.front());
            q.pop();
        }
        else
        {
            a=fin.top();
            fin.pop();
            b=fin.top();
            fin.pop();
            switch(q.front())
            {
                case -3:{a=b+a;break;}
                case -4:{a=b-a;break;}
                case -5:{a=b*a;break;}
                case -6:{a=b/a;break;}
            }
            q.pop();
            fin.push(a);
        }
    }
    printf("%d\n",fin.top());
    return 0;
}