Cod sursa(job #2991079)

Utilizator AndreiMLCChesauan Andrei AndreiMLC Data 8 martie 2023 23:52:36
Problema Evaluarea unei expresii Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.2 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <cstring>

using namespace std;

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

char s[100005];
stack <int> nr;
stack <char> op;
int ind;

void numere(int i)
{
    if (nr.empty())
    {
        nr.push(s[i] - '0');
    }
    else if (s[i - 1] >= '0' && s[i - 1] <= '9') {
        int nou = nr.top();
        nr.pop();
        nou = nou * 10 + (s[i] - '0');
        nr.push(nou);
    }
    else {
        nr.push(s[i] - '0');
    }
}

void semne(int i)
{
    if (s[i] == '(')
    {
        op.push('(');
    }
    else if (s[i] == ')')
    {
        while (op.top() != '(')
        {
            int nr1 = nr.top();
            nr.pop();
            int nr2 = nr.top();
            nr.pop();
            if (op.top() == '+')
            {
                nr.push(nr1 + nr2);
            }
            else {
                nr.push(nr2 - nr1);
            }
            op.pop();
        }
        op.pop();
    }
    else if (op.top() == '*' || op.top() == '/')
    {
        int nr1 = nr.top();
        nr.pop();
        int nr2 = nr.top();
        nr.pop();
        if (op.top() == '*')
        {
            nr.push(nr1 * nr2);
        }
        else {
            nr.push(nr2 / nr1);
        }
        op.pop();
        op.push(s[i]);
    }
    else {
        op.push(s[i]);
    }
}

void check()
{
    while (op.size() > 1)
    {
        int nr1 = nr.top();
        nr.pop();
        int nr2 = nr.top();
        nr.pop();
        if (op.top() == '*')
        {
            nr.push(nr1 * nr2);
        }
        else if(op.top() == '/'){
            nr.push(nr2 / nr1);
        }else if (op.top() == '+')
        {
            nr.push(nr1 + nr2);
        }
        else {
            nr.push(nr2 - nr1);
        }
        op.pop();
    }
}
int main()
{
    f.get(s, 100001);
    int lung = strlen(s);
    op.push('(');
    for (int i = 0; i <= lung - 1; i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            numere(i);
        }
        else {
            semne(i);
        }
    }
    check();
    g << nr.top();
    return 0;
}