Cod sursa(job #2710721)

Utilizator dariadragomir23Dragomir Daria dariadragomir23 Data 22 februarie 2021 22:05:59
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <fstream>
#include <cstring>
#include <stack>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char s[100005];
int lgs, poz;
stack <char> semne;
stack <int> numere;
void evaluare_operatie()
{
    int semn=semne.top(), nr2=numere.top();
    numere.pop();
    semne.pop();
    int nr1=numere.top();
    numere.pop();
    switch(semn)
    {
    case '+':
    {
        numere.push(nr1+nr2);
        break;
    }
    case '-':
    {
        numere.push(nr1-nr2);
        break;
    }
    case '*':
    {
        numere.push(nr1*nr2);
        break;
    }
    case '/':
    {
        numere.push(nr1/nr2);
        break;
    }
    }
}
bool posibilitate(char pus, char vrem_punem)
{
    if(pus=='(')
        return 1;///se poate
    if(pus=='+'||pus=='-')
        if(vrem_punem=='*'||vrem_punem=='/')
            return 1;
    return 0;
}
void transf_in_nr()
{
    int nr=0;
    while(isdigit(s[poz]))
    {
        nr=nr*10+(s[poz]-'0');
        poz++;
    }
    numere.push(nr);
}
void evaluare()
{
    while(poz<lgs)
    {
        switch(s[poz])
        {
        case '(':
        {
            semne.push('(');
            poz++;
            break;
        }
        case ')':
        {
            while(semne.top()!='(')
                evaluare_operatie();
            semne.pop();
            poz++;
            break;
        }
        case '+':
        case '-':
        case '*':
        case '/':
        {
            while(!semne.empty()&&posibilitate(semne.top(), s[poz])==0)
                evaluare_operatie();
            semne.push(s[poz]);
            poz++;
            break;
        }
        default:
            transf_in_nr();
        }
    }
    while(!semne.empty())
    {
        evaluare_operatie();
    }
}

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