Cod sursa(job #2855567)

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

using namespace std;

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

stack <char> operanzi;
stack <float> 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(i<n && isdigit(sir[i]))
            {
                x=x*10+sir[i]-'0';
                i++;
            }
            i--;
            operatori.push(x); 
        }
        else if(sir[i]==')' && !operanzi.empty()) 
        {
            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=='-') 
                    {
                        int X=x, Y=y;
                        operatori.push(Y-X);
                    }
                    else if(c=='+') 
                    {
                        int X=x, Y=y;
                        operatori.push(Y+X);
                    }
                    else operatori.push((float)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((float)y/x);
                }
                operanzi.push(sir[i]);
            }
        }
    }
    while(!operanzi.empty())
    {
        if(operanzi.top()=='(') operanzi.pop();
        else 
        {
            float x=operatori.top();
            operatori.pop();
            float y=operatori.top();
            operatori.pop();
            char c=operanzi.top();
            operanzi.pop();
            if(c=='*') operatori.push(x*y);
            else if(c=='-') 
            {
                int X=x, Y=y;
                operatori.push(Y-X);
            }
            else if(c=='+') 
            {
                int X=x, Y=y;
                operatori.push(Y+X);
            }
            else operatori.push((float)y/x);
        }
    }
    g<<operatori.top();
}