Cod sursa(job #1042824)

Utilizator ShaDoWsiD100Rzv Rzv ShaDoWsiD100 Data 27 noiembrie 2013 18:37:37
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include<string.h>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char s[100001], st2[100001];
int st1[100001],v1,v2,k,ok,nr,pr[256];
int calcul(int a,int b, char ch){
  if(ch=='*')
   return a*b;
  if(ch=='+')
    return a+b;
  if(ch=='-')
   return b-a;
   if(ch=='/')
    return b/a;
}
int main()
{
    f>>s;
    pr['(']=1;
    pr['*']=pr['/']=3;
    pr['+']=pr['-']=2;
    v1=0;v2=0;nr=0;
int     n=strlen(s);
    for(int i=0;i<n;i++)
        if(s[i]==')'){
            if(ok==1){
               v1++;st1[v1]=nr;
               ok=0;
               nr=0;
            }
            while(st2[v2]!='('){
                   k=calcul(st1[v1],st1[v1-1],st2[v2]);
                   v2--;
                   v1--;
                   st1[v1]=k;
            }
            v2--;
        }
      else
       if(strchr("*+-/",s[i])){
           if(ok==1){
               v1++;st1[v1]=nr;
               ok=0;
               nr=0;
            }
            while(v2>0&&pr[s[i]]<=pr[st2[v2]]){
                  k=calcul(st1[v1],st1[v1-1],st2[v2]);
                   v2--;
                   v1--;
                   st1[v1]=k;
               }
              v2++;st2[v2]=s[i];


       }
       else
          if(s[i]=='(')
             {
                 v2++;
                 st2[v2]='(';
             }
             else{
                nr=nr*10+s[i]-'0';
                 ok=1;
             }
   if(ok==1)
     {
         v1++;st1[v1]=nr;
     }
   while(v2>0){
     k=calcul(st1[v1],st1[v1-1],st2[v2]);
                   v2--;
                   v1--;
                   st1[v1]=k;
   }
   g<<st1[v1];
   return 0;
}