Cod sursa(job #2302855)

Utilizator PandaChanTrusca Daria PandaChan Data 15 decembrie 2018 10:54:44
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.33 kb
#include <fstream>
#include <stack>
#include <cstring>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char a[100005];
int p;
stack <char> op;
stack <int> nr;
int evaluare(int x, int y, char semn)
{
    switch(semn)
    {
    case '+':
        return x+y;
    case '-':
        return x-y;
    case '/':
        return x/y;
    case '*':
        return x*y;
    }
}
int next()
{
    int n=0;
    while(a[p]>='0' && a[p]<='9')
        n=n*10+(a[p++]-'0');
    return n;
}
int prioritate(char s1, char s2)
{
    if(s1=='(')
        return 1;
    if( (s1=='-' || s1=='+') && (s2=='*' || s2=='/'))
        return 1;
    return 0;
}
int main()
{
    f.getline(a, 100005);
    int l=strlen(a);
    while(p<l)
    {
        switch(a[p])
        {
        case '(':
        {
            op.push(a[p++]);
            break;
        }
        case ')':
        {
            while(op.top()!='(')
            {
                int v2=nr.top();
                nr.pop();
                int v1=nr.top();
                nr.pop();
                char semn=op.top();
                op.pop();
                nr.push(evaluare(v1, v2, semn));
            }
            op.pop();
            p++;
            break;
        }
        case'+':
        case'-':
        case'*':
        case'/':
        {
            if(op.empty() || prioritate(op.top(),a[p])==1)
            {
                op.push(a[p++]);
            }
            else
            {
                do
                {
                    int v2=nr.top();
                    nr.pop();
                    int v1=nr.top();
                    nr.pop();
                    char semn=op.top();
                    op.pop();
                    nr.push(evaluare(v1,v2,semn));
                }
                while(!op.empty() &&
                        prioritate(op.top(),a[p])==0);
                op.push(a[p++]);
            }
            break;
        }
        default :
        {
            nr.push(next());
        }
        }
    }
    while(!op.empty())
    {
        int v2=nr.top();
        nr.pop();
        int v1=nr.top();
        nr.pop();
        char semn=op.top();
        op.pop();
        nr.push(evaluare(v1,v2,semn));
    }
    g<<nr.top();
    return 0;
}