Cod sursa(job #1179821)

Utilizator petiVass Peter peti Data 29 aprilie 2014 12:59:28
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <cctype>
using namespace std;

stack<int> val;
stack<char> op;

inline int prec(char o){
    switch(o){
        case '*':return 2;
        case '/':return 2;
        case '-':return 1;
        case '+':return 1;
        case '(':return 0;
    }
    return 0;
}

inline int eval(){
    int b=val.top();val.pop();
    int a=val.top();val.pop();
    char o=op.top();op.pop();
    switch(o){
        case '+':return a+b;
        case '-':return a-b;
        case '*':return a*b;
        case '/':return a/b;
    }
    return 0;
}



int main(){
    ifstream ifs("evaluare.in");
    ofstream ofs("evaluare.out");
    while(ifs.good()){
        if(isdigit(ifs.peek())){
            int ibuf;
            ifs>>ibuf;
            val.push(ibuf);
        }
        else{
            char cbuf;
            ifs>>cbuf;
            if(ifs.eof()) break;
            if(cbuf=='(')
                op.push('(');
            else if(cbuf==')'){

                while(op.top()!='(')
                    val.push(eval());
                op.pop();
            }
            else{
                if(!op.empty())
                    while(prec(cbuf)<=prec(op.top())){
                        val.push(eval());
                        if(op.empty()) break;
                    }
                op.push(cbuf);
            }
        }
    }
    while(!op.empty())
       val.push(eval());
    ofs<<val.top()<<"\n";
}