Cod sursa(job #2492501)

Utilizator rchiteaIRCHIT rchitea Data 14 noiembrie 2019 20:30:45
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.31 kb

#include <iostream>
#include <fstream>
#include <stack>
#include <cstring>

using namespace std;

char s[100005];
int p=0;

stack <char> op;
stack <int> nr;

int eval(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 nextnum()
{
    int numar=0;
    while(s[p]>='0' && s[p]<='9')
        numar=numar*10+(s[p++]-'0');
    return numar;
}

int prioritate(char s1, char s2)
{
    if(s1=='(')
        return 1;
    if((s1=='-' || s1=='+') && (s2=='*' || s2=='/'))
        return 1;
    return 0;
}

int main()
{
    ifstream in("evaluare.in");
    ofstream out("evaluare.out");
    in.getline(s,100005);
    int n=strlen(s);
    while(p<n)
    {
        switch (s[p])
        {
        case '(':{op.push(s[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(eval(v1,v2,semn));
            }
            op.pop();
            p++;
            break;
            }
        case'+':
        case'-':
        case'*':
        case'/':{
            if(op.empty() || prioritate(op.top(),s[p])==1)
            {
                op.push(s[p++]);
            }
            else
            {
                do{
                    int v2=nr.top();
                    nr.pop();
                    int v1=nr.top();
                    nr.pop();
                    char semn=op.top();
                    op.pop();
                    nr.push(eval(v1,v2,semn));
                }while(!op.empty() && prioritate(op.top(),s[p])==0);
                op.push(s[p++]);

            }
            break;
        }
        default :{
            nr.push(nextnum());
        }
        }

    }
    while(!op.empty())
    {
         int v2=nr.top();
                    nr.pop();
                    int v1=nr.top();
                    nr.pop();
                    char semn=op.top();
                    op.pop();
                    nr.push(eval(v1,v2,semn));
    }
    cout<<nr.top();
    return 0;
}