Cod sursa(job #3293299)

Utilizator tudorhTudor Horobeanu tudorh Data 11 aprilie 2025 13:26:14
Problema Evaluarea unei expresii Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.74 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
string v;
stack<int>s;
/// -3131 => +
/// -2211 => *
/// -3323 => (
/// -3222 => /
/// -3232 => -
int main()
{
    fin>>v;
    s.push(-3323);
    bool semn=0;
    for(int i=0; i<v.size(); i++)
    {
        if(v[i]>='0' && v[i]<='9')
        {
            int nr=0;
            while(i<v.size() && v[i]>='0' && v[i]<='9')
            {
                nr=nr*10+v[i]-'0';
                i++;
            }
            if(semn)
            {
                semn=0;
                nr=-nr;
            }
            i--;
            if(s.top()==-2211) ///*
            {
                s.pop();
                int prod=nr*s.top();
                s.pop();
                s.push(prod);
            }
            else if(s.top()==-3222) /// /
            {
                s.pop();
                int cat=s.top()/nr;
                s.pop();
                s.push(cat);
            }
            else s.push(nr);
        }
        else if(v[i]=='+')
            s.push(-3131);
        else if(v[i]=='*')
            s.push(-2211);
        else if(v[i]=='/')
            s.push(-3222);
        else if(v[i]=='(')
            s.push(-3323);
        else if(v[i]=='-')
        {
            if(s.top()==-3131 || s.top()==-2211 || s.top()==-3222 || s.top()==-3323)
                semn=1;
            else s.push(-3232);
        }
        else if(v[i]==')')
        {
            int nr=s.top();
            s.pop();
            while(s.top()!=-3323)
            {
                if(s.top()==-3131)
                {
                    s.pop();
                    nr+=s.top();
                    s.pop();
                }
                else if(s.top()==-3232)
                {
                    s.pop();
                    nr=s.top()-nr;
                    s.pop();
                }
            }
            s.pop();
            if(s.top()==-2211) ///*
            {
                s.pop();
                int prod=nr*s.top();
                s.pop();
                s.push(prod);
            }
            else if(s.top()==-3222) /// /
            {
                s.pop();
                int cat=s.top()/nr;
                s.pop();
                s.push(cat);
            }
            else s.push(nr);
        }
    }
    int nr=s.top();
    s.pop();
    while(s.top()!=-3323)
    {
        if(s.top()==-3131)
        {
            s.pop();
            nr+=s.top();
            s.pop();
        }
        else if(s.top()==-3232)
        {
            s.pop();
            nr=s.top()-nr;
            s.pop();
        }
    }
    fout<<nr;
    return 0;
}