Cod sursa(job #2063493)

Utilizator crastanRavariu Eugen crastan Data 11 noiembrie 2017 11:49:43
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#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;
}