Cod sursa(job #2355215)

Utilizator cristina-criCristina cristina-cri Data 25 februarie 2019 21:40:01
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;

char s[100005];

stack <char> op;
stack <int> nr;

int semn(int x, int y, char se)
{
    if(se == '+')
        return x+y;
    if(se == '-')
        return x-y;
    if(se == '*')
        return x*y;
    if(se == '/')
        return x/y;
}

void adauga()
{
    int v2=nr.top();
    nr.pop();
    int v1=nr.top();
    nr.pop();
    int semnn=op.top();
    op.pop();
    int ele=semn(v1, v2, semnn);
    nr.push(ele);
}

int ordine(char semn, char sv)
{
    if(semn == '(')
        return 1;
    if((semn == '+' || semn == '-') && (sv == '*' || sv == '/'))
        return 1;
    return 0;
}

int numar(int &i)
{
    int nr=0;
    while(s[i]>='0' && s[i]<='9')
        nr=nr*10+(s[i++]-'0');
    return nr;
}


int main()
{
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);

    scanf("%s", s);
    int n=strlen(s);
    for(int i=0; i<n; i++)
    {
        if(s[i] == '(')
        {
            op.push(s[i]);
            continue;
        }
        if(s[i] == ')')
        {
            while(op.top() != '(')
            {
                adauga();
            }
            op.pop();
            continue;
        }
        if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
        {
            if(op.empty() || ordine(op.top(), s[i]) == 1)
                op.push(s[i]);
            else
            {
                do
                {
                    adauga();
                }
                while(!op.empty() && ordine(op.top(), s[i]) == 0);
                op.push(s[i]);
            }
            continue;
        }
        nr.push(numar(i));
        i--;

    }
    while(!op.empty())// && !nr.empty())
    {
        adauga();
    }
    printf("%d", nr.top());
    return 0;
}