Cod sursa(job #362686)

Utilizator csizMocanu Calin csiz Data 10 noiembrie 2009 17:53:16
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 6.93 kb
#include <iostream>
#include <fstream>
#include <string>
#include <stack>

using namespace std;
bool cifra(string& s,unsigned int& i){
    return (s[i]>='0' and s[i]<='9');
}
int numar(string& s,unsigned int&i){
    int rez=0;
    while(cifra(s,i)){
        rez*=10;rez+=s[i]-'0';
        i++;
    }
    return rez;
}


int main(){
    ifstream in("evaluare.in");
    ofstream out("evaluare.out");
    string s;
    in>>s;
    stack<int> operanzi;


    stack<char> operatori;
    unsigned int i=0;
    while(i<s.length()){
        if(cifra(s,i)){
            operanzi.push(numar(s,i));
        }else if(s[i]=='+'){
            i++;
            if(operatori.empty()) operatori.push('+');
            else{
                if(operatori.top()=='+'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b+a);
                    operatori.pop();
                }
                else if(operatori.top()=='-'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b-a);
                    operatori.pop();
                }else if(operatori.top()=='*'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b*a);
                    operatori.pop();
                }
                else if(operatori.top()=='/'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b/a);
                    operatori.pop();
                }
                operatori.push('+');
            }
        }else if(s[i]=='-'){
            i++;
            if(operatori.empty()) operatori.push('-');
            else{
                if(operatori.top()=='+'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b+a);
                    operatori.pop();
                }
                else if(operatori.top()=='-'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b-a);
                    operatori.pop();
                }else if(operatori.top()=='*'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b*a);
                    operatori.pop();
                }
                else if(operatori.top()=='/'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b/a);
                    operatori.pop();
                }
                operatori.push('-');
            }
        }else if(s[i]=='*'){
            i++;
            if(operatori.empty()) operatori.push('*');
            else{
                if(operatori.top()=='*'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b*a);
                    operatori.pop();
                }
                else if(operatori.top()=='/'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b/a);
                    operatori.pop();
                }
                operatori.push('*');
            }
        }else if(s[i]=='/'){
            i++;
            if(operatori.empty()) operatori.push('/');
            else{
                if(operatori.top()=='*'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b*a);
                    operatori.pop();
                }
                else if(operatori.top()=='/'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b/a);
                    operatori.pop();
                }
                operatori.push('/');
            }
        }else if(s[i]=='('){
            i++;
            operatori.push('(');
        }else if(s[i]==')'){
            i++;
            while(operatori.top()!='('){
                if(operatori.top()=='+'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b+a);
                    operatori.pop();
                }
                else if(operatori.top()=='-'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b-a);
                    operatori.pop();
                }else if(operatori.top()=='*'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b*a);
                    operatori.pop();
                }
                else if(operatori.top()=='/'){
                    int a,b;
                    a=operanzi.top();operanzi.pop();
                    b=operanzi.top();operanzi.pop();
                    operanzi.push(b/a);
                    operatori.pop();
                }
            }
            operatori.pop();
        }
    }

    while(!operatori.empty()){
        if(operatori.top()=='+'){
                int a,b;
                a=operanzi.top();operanzi.pop();
                b=operanzi.top();operanzi.pop();
                operanzi.push(b+a);
                operatori.pop();
            }
            else if(operatori.top()=='-'){
                int a,b;
                a=operanzi.top();operanzi.pop();
                b=operanzi.top();operanzi.pop();
                operanzi.push(b-a);
                operatori.pop();
            }else if(operatori.top()=='*'){
                int a,b;
                a=operanzi.top();operanzi.pop();
                b=operanzi.top();operanzi.pop();
                operanzi.push(b*a);
                operatori.pop();
            }
            else if(operatori.top()=='/'){
                int a,b;
                a=operanzi.top();operanzi.pop();
                b=operanzi.top();operanzi.pop();
                operanzi.push(b/a);
                operatori.pop();
            }
    }
    out<<operanzi.top();
}