Cod sursa(job #1413929)

Utilizator raluca1234Tudor Raluca raluca1234 Data 2 aprilie 2015 11:04:50
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.83 kb
#include<iostream>
#include<fstream>
#include<cstring>
#define MAX 3000000000
using namespace std;
char s[100005];
int n,st[1000],v,i,j;

void verifica() {
 if (st[v]>=0&&st[v]<=MAX && st[v-2]>=0&&st[v-2]<=MAX && v>2)
     switch (st[v-1]) {
        case -2: // +
            if (s[i+1]!='/'&&s[i+1]!='*') {
                st[v-2]=st[v-2]+st[v];
                v=v-2;
            }
            break;
         case -3: // -
            if (s[i+1]!='/'&&s[i+1]!='*') {
                st[v-2]=st[v-2]-st[v];
                v=v-2;
            }
            break;
         case -4: // *
            st[v-2]=st[v-2]*st[v];
            v=v-2; break;
         case -5: // /
            st[v-2]=st[v-2]/st[v];
            v=v-2; break;
    }

}


int main() {
    ifstream f("evaluare.in");
    ofstream g("evaluare.out");
    f.getline(s,100005);
    n=strlen(s);

    v=0; //varful stivei
    for (i=0; i<n; i++) {
        switch (s[i]) {
            case '(':
                v++; st[v]=-1;
                break;
            case '+':
                v++; st[v]=-2;
                break;
            case '-':
                v++; st[v]=-3;
                break;
            case '*':
                v++; st[v]=-4;
                break;
            case '/':
                v++; st[v]=-5;
                break;
            case ')':
                st[v-1]=st[v];
                v--;
                break;
            default: //cand s[i]=cifra
                v++; st[v]=s[i]-'0';
                while (s[i+1]>='0'&&s[i+1]<='9') {
                    i++;
                    st[v]=st[v]*10+(s[i]-'0');
                }
                break;
        } //sfarsit switch
        if (st[v]>=0&&st[v]<=MAX && st[v-2]>=0&&st[v-2]<=MAX && v>2)
                switch (st[v-1]) {
                    case -2: // +
                        if (s[i+1]!='/'&&s[i+1]!='*') {
                            st[v-2]=st[v-2]+st[v];
                            v=v-2;
                        }
                        break;
                    case -3: // -
                        if (s[i+1]!='/'&&s[i+1]!='*') {
                            st[v-2]=st[v-2]-st[v];
                            v=v-2;
                        }
                        break;
                    case -4: // *
                        st[v-2]=st[v-2]*st[v];
                        v=v-2;
                        verifica();break;
                    case -5: // /
                        st[v-2]=st[v-2]/st[v];
                        v=v-2;
                        verifica(); break;
                    }

     //   for (j=1; j<=v; j++)
      //      cout<<st[j]<<' ';
      //  cout<<'\n';
    }
    if (v>1){
        verifica();
    }

    g<<st[v]<<'\n';


    f.close();
    g.close();
    return 0;
}