Cod sursa(job #3233024)

Utilizator thomascrusaderSandu Edward thomascrusader Data 2 iunie 2024 11:35:04
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.45 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <stack>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char car[100001];
int precedenta(char op)
{
    if(op=='+' || op=='-')
        return 1;
    if(op=='*' || op=='/')
        return 2;
    else
        return 0;
}
int operatii(int n,int m, char c)
{
    if(c=='+')
        return n+m;
    if(c=='-')
        return n-m;
    if(c=='*')
        return n*m;
    if(c=='/')
        return n/m;
}
int evaluare(string expresie)
{
    int i;
    stack<int>valoare;
    stack<char>operanzi;
    int x=expresie.length();
    for(i=0;i<x;i++)
    {
        if(expresie[i]==' ')
        continue;
        if(expresie[i]=='(')
        {
            operanzi.push(expresie[i]);
        }
        else
        if(isdigit(expresie[i]))
        {
            int val=0;
            while(i<x&& isdigit(expresie[i]))
            {
                val=(val*10)+(expresie[i]-'0');
                i++;
            }
            valoare.push(val);
            i--;
        }
        else
        if(expresie[i]==')')
        {
            while(!operanzi.empty() && operanzi.top()!='(')
            {
                int val2=valoare.top();
                valoare.pop();
                int val1=valoare.top();
                valoare.pop();
                char op=operanzi.top();
                operanzi.pop();
                valoare.push(operatii(val1,val2,op));
            }
            if(!operanzi.empty())
                operanzi.pop();
        }
        else
        {
            while(!operanzi.empty() && precedenta(operanzi.top())>=precedenta(expresie[i]))
            {
                int val2=valoare.top();
                valoare.pop();
                int val1=valoare.top();
                valoare.pop();
                char op=operanzi.top();
                operanzi.pop();
                valoare.push(operatii(val1,val2,op));
            }
            operanzi.push(expresie[i]);
        }
    }
    while(!operanzi.empty())
    {
        int val2=valoare.top();
        valoare.pop();
        int val1=valoare.top();
        valoare.pop();
        char op=operanzi.top();
        operanzi.pop();
        valoare.push(operatii(val1,val2,op));
    }
    return valoare.top();
}
int main()
{
    string sir;
    getline(fin, sir);
    fout << evaluare(sir);
    return 0;
}