Cod sursa(job #2672002)

Utilizator dariadragomir23Dragomir Daria dariadragomir23 Data 12 noiembrie 2020 22:00:43
Problema Evaluarea unei expresii Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <stack>

using namespace std;

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

char s[100005];
stack <char> semne;
stack <int> numere;

void evaluare_operatie()
{
    int a=numere.top();
    numere.pop();
    int b=numere.top();
    numere.pop();
    char semn=semne.top();
    semne.pop();
    switch(semn)
    {
    case '+':
        numere.push(b+a);
        break;
    case '-':
        numere.push(b-a);
        break;
    case '*':
        numere.push(b*a);
        break;
    case '/':
        numere.push(b/a);
        break;
    }
}

void evaluare_secventa()
{
    while(!semne.empty()&&semne.top()!='(')
        evaluare_operatie();
}

int prioritate(char op)
{
    if(semne.empty()||semne.top()=='(')
        return 0;
    if(op=='+'||op=='-')
        return 1; ///tre sa facem evaluare
    if(semne.top()=='/'||semne.top()=='*')
        return 1;
    return 0;
}

void evaluare()
{
    int lgs=strlen(s);
    for(int i=0; i<lgs; i++)
    {
        if(s[i]=='(')
        {
            semne.push('(');
            continue;
        }
        if(s[i]==')')
        {
            evaluare_secventa();
            semne.pop(); ///pt ca ramasese (
            continue;
        }
        if(isdigit(s[i]))
        {
            int nr=0;
            while(isdigit(s[i]))
            {
                nr=nr*10+s[i]-'0';
                i++;
            }
            i--;
            numere.push(nr);
            continue;
        }
        if(prioritate(s[i]))
            evaluare_operatie();
        semne.push(s[i]);
    }
    evaluare_secventa();
}

int main()
{
    f.getline(s, 100005);
    evaluare();
    g<<numere.top();
    return 0;
}