Cod sursa(job #2067474)

Utilizator adi1607Ciurea Adi adi1607 Data 16 noiembrie 2017 14:52:48
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 6.08 kb
#include <fstream>
#include <cctype>
#include <cstring>
#include <vector>
#include <stack>
using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
char s[100001];
vector<int>polo;
stack<char>op;
inline int prior(char ch)
{
    switch(ch)
    {
        case'*':
        case'/':
        case'%':return 2;
        case'+':
        case'-':return 1;
        default:return 0;
    }
}
int main()
{
    in.getline(s,10001);
    int n,i,a,b;
    n=strlen(s);
    int nr=0,number=0;
    for(i=0;i<n;i++)
    {

        if(isdigit(s[i]))
        {
            nr=nr*10+s[i]-'0';
            number=1;
            continue;
        }
        else if(number==1)
            {
                polo.push_back(nr);
                nr=0;
                number=0;
            }
        if(s[i]=='(')
            {
                op.push(s[i]);
                continue;
            }
            if(s[i]==')')
            {
                while(!op.empty() && op.top()!='(')
                        {
                            switch(op.top())
                            {
                                case '+':a=polo.back();
                                        polo.pop_back();
                                        b=polo.back();
                                        polo.pop_back();
                                        polo.push_back(a+b);
                                        break;
                                case '-':a=polo.back();
                                        polo.pop_back();
                                        b=polo.back();
                                        polo.pop_back();
                                        polo.push_back(b-a);
                                        break;
                                case '*':a=polo.back();
                                        polo.pop_back();
                                        b=polo.back();
                                        polo.pop_back();
                                        polo.push_back(a*b);
                                        break;
                                case '/':a=polo.back();
                                        polo.pop_back();
                                        b=polo.back();
                                        polo.pop_back();
                                        polo.push_back(b/a);
                                        break;
                            }
                            op.pop();
                        }
                op.pop();
                continue;
            }
            if(op.empty() || prior(s[i])>prior(op.top()))
                op.push(s[i]);
                else
                {
                    while(!op.empty() && prior (s[i])<=prior(op.top()))
                    {
                        switch(op.top())
                            {
                                case '+':a=polo.back();
                                        polo.pop_back();
                                        b=polo.back();
                                        polo.pop_back();
                                        polo.push_back(a+b);
                                        break;
                                case '-':a=polo.back();
                                        polo.pop_back();
                                        b=polo.back();
                                        polo.pop_back();
                                        polo.push_back(b-a);
                                        break;
                                case '*':a=polo.back();
                                        polo.pop_back();
                                        b=polo.back();
                                        polo.pop_back();
                                        polo.push_back(a*b);
                                        break;
                                case '/':a=polo.back();
                                        polo.pop_back();
                                        b=polo.back();
                                        polo.pop_back();
                                        polo.push_back(b/a);
                                        break;
                            }
                        op.pop();

                    }
                    op.push(s[i]);
                }
    }
    if(number==1)
            {
                polo.push_back(nr);
                nr=0;
                number=0;
            }
    while(!op.empty())
    {
        switch(op.top())
                            {
                                case '+':a=polo.back();
                                        polo.pop_back();
                                        b=polo.back();
                                        polo.pop_back();
                                        polo.push_back(a+b);
                                        break;
                                case '-':a=polo.back();
                                        polo.pop_back();
                                        b=polo.back();
                                        polo.pop_back();
                                        polo.push_back(b-a);
                                        break;
                                case '*':a=polo.back();
                                        polo.pop_back();
                                        b=polo.back();
                                        polo.pop_back();
                                        polo.push_back(a*b);
                                        break;
                                case '/':a=polo.back();
                                        polo.pop_back();
                                        b=polo.back();
                                        polo.pop_back();
                                        polo.push_back(b/a);
                                        break;
                            }
        op.pop();
    }


    vector<int>:: iterator it;
    for(it=polo.begin();it<polo.end();it++)
        out<<*it;
    return 0;
}