Cod sursa(job #1974921)

Utilizator dorupopDoru Pop dorupop Data 29 aprilie 2017 13:55:33
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <cstring>
using namespace std;
char op[100001],s[100001],pr[256];
int od[100001],v1,v2,nr;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
int calcul (int a, int b, char ch){

     switch (ch){
       case '+': return a+b;
       case '-': return a-b;
       case '*': return a*b;
       case '/': return a/b;

     }


}
int main()
{
    f>>s;pr['+']=pr['-']=1;
    pr['/']=pr['*']=2;
    for(int i=0;s[i]!=0;i++)
     if(s[i]=='('){
        op[++v1]='(';
       }
       else
       if(s[i]==')'){
        while(op[v1]!='('){
              nr=calcul(od[v2-1],od[v2],op[v1]);
              v1--;
              v2--;
              od[v2]=nr;
       }
     v1--;// eliminam (
   }
    else
    if(s[i]>='0' &&s[i]<='9'){
       nr=0;
int        j=i;
        while(s[j]>='0'&&s[j]<='9'&&s[j]!=0){
            nr=nr*10+s[j]-'0';
            j++;
        }
       if(i==1&&s[i-1]=='-'||i>1&&s[i-1]=='-'&&strchr("+-/*(",s[i-2])!=0)
            nr=-nr;
       od[++v2]=nr;
       i=j-1;
     }
     else{
        while(v1>0&&pr[s[i]]<=pr[op[v1]]){
            nr=calcul(od[v2-1],od[v2],op[v1]);
              v1--;
              v2--;
              od[v2]=nr;

        }
        op[++v1]=s[i];

     }
  while(v1>0)
        {
            nr=calcul(od[v2-1],od[v2],op[v1]);
              v1--;
              v2--;
              od[v2]=nr;

        }
  g<<od[1];
    return 0;
}