Cod sursa(job #2855543)

Utilizator gabriela.stanStan Luciana-Gabriela gabriela.stan Data 22 februarie 2022 16:22:45
Problema Evaluarea unei expresii Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.47 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <cstring>

using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");

stack <char> operanzi;
stack <int> operatori;

char sir[100001];

int main()
{
    f>>sir;
    int n=strlen(sir);
    for(int i=0; i<n; i++)
    {
        if(isdigit(sir[i]))
        {
            int x=0;
            while(isdigit(sir[i]) && i<n)
            {
                x=x*10+sir[i]-'0';
                i++;
            }
            i--;
            operatori.push(x); 
        }
        else if(sir[i]==')') 
        {
            if(operanzi.top()=='(') operanzi.pop();
            else
            {
                while(operanzi.top()!='(')
                {
                    int x=operatori.top();
                    operatori.pop();
                    int y=operatori.top();
                    operatori.pop();
                    char c=operanzi.top();
                    operanzi.pop();
                    if(c=='*') operatori.push(x*y);
                    else if(c=='-') operatori.push(y-x);
                    else if(c=='+') operatori.push(y+x);
                    else operatori.push(y/x);
                }
                operanzi.pop();
            }
        }
        else if(operanzi.empty()) operanzi.push(sir[i]);
        else if(sir[i]=='(') operanzi.push(sir[i]);
        else
        {
            if(sir[i]=='*' || sir[i]=='/') operanzi.push(sir[i]);
            else
            {
                while(!operanzi.empty() && (operanzi.top()=='*' || operanzi.top()=='/'))
                {
                    int x=operatori.top();
                    operatori.pop();
                    int y=operatori.top();
                    operatori.pop();
                    char c=operanzi.top();
                    operanzi.pop();
                    if(c=='*') operatori.push(x*y);
                    else operatori.push(y/x);
                }
                operanzi.push(sir[i]);
            }
        }
    }
    while(!operanzi.empty())
    {
        if(operanzi.top()=='(') operanzi.pop();
        else 
        {
            int x=operatori.top();
            operatori.pop();
            int y=operatori.top();
            operatori.pop();
            char c=operanzi.top();
            operanzi.pop();
            if(c=='*') operatori.push(x*y);
            else if(c=='-') operatori.push(y-x);
            else if(c=='+') operatori.push(y+x);
            else operatori.push(y/x);
        }
    }
    g<<operatori.top();
}