Cod sursa(job #2302847)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 15 decembrie 2018 10:52:08
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.44 kb
#include <iostream>
#include <stack>
#include <cstdio>
#include <string.h>
using namespace std;

stack<int> numere;
stack<char> sign;

char s[100005];
int i = 0, n;

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

void parcurgere()
{
    for(;i<n; i++)
    {
        if(s[i]>='0' && s[i]<='9')
            numere.push(numar());
        else if(s[i] == '(')
        {
            sign.push(s[i]);
        }
        else if(s[i] == '*' || s[i] == '/')
        {
            while(!sign.empty() && (sign.top() == '*' || sign.top() == '/'))
            {
                int a = numere.top();
                numere.pop();
                int b = numere.top();
                numere.pop();
                if(sign.top() == '*')
                {
                    numere.push(a*b);
                }
                else
                {

                    numere.push(b/a);
                }
                sign.pop();
            }
            sign.push(s[i]);
        }
        else if(s[i] == '+' || s[i] == '-')
        {
            while(!sign.empty() && (sign.top() == '*' || sign.top() == '/' || sign.top() == '+' || sign.top() == '-'))
            {
                int a = numere.top();
                numere.pop();
                int b = numere.top();
                numere.pop();
                if(sign.top() == '*')
                {
                    numere.push(a*b);
                }
                else if(sign.top() == '/')
                {

                    numere.push(b/a);
                }
                else if(sign.top() == '+')
                {
                    numere.push(a+b);
                }
                else
                {
                    numere.push(b-a);
                }
                sign.pop();
            }
            sign.push(s[i]);
        }
        else if(s[i] == ')')
        {
            while(sign.top() != '(')
            {
                int a = numere.top();
                numere.pop();
                int b = numere.top();
                numere.pop();
                if(sign.top() == '*')
                {
                    numere.push(a*b);
                }
                else if(sign.top() == '/')
                {

                    numere.push(b/a);
                }
                else if(sign.top() == '+')
                {
                    numere.push(a+b);
                }
                else
                {
                    numere.push(b-a);
                }
                sign.pop();
            }
            sign.pop();
        }
    }
}

int main()
{
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);
    scanf("%s", s);
    n = strlen(s);
    parcurgere();
    while(!sign.empty())
    {
        int x = numere.top();
        numere.pop();
        int y = numere.top();
        numere.pop();
        if(sign.top() == '*')
        {
            numere.push(x*y);
        }
        else if(sign.top() == '/')
        {

            numere.push(y/x);
        }
        else if(sign.top() == '+')
        {
            numere.push(x+y);
        }
        else
        {
            numere.push(y-x);
        }
        sign.pop();
    }
    printf("%d", numere.top());
    return 0;
}