Cod sursa(job #2355731)

Utilizator cristii2000cristiiPanaite Cristian cristii2000cristii Data 26 februarie 2019 11:52:33
Problema Evaluarea unei expresii Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.23 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <stack>

using namespace std;

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

char s[100005];
int poz = 0;
stack <char> signs;
stack <int> numbers;
int nrStiva = 0;

int calc(int v1, int v2, char s)
{
    switch(s)
    {
    case '+' :
        return v1 + v2;
    case '-' :
        return v1 - v2;
    case '*' :
        return v1 * v2;
    case '/' :
        return v1 / v2;
    }
}
void add()
{
    int val2 = numbers.top();
    numbers.pop();
    int val1 = numbers.top();
    numbers.pop();
    char sign = signs.top();
    signs.pop();
    numbers.push(calc(val1, val2, sign));
}

int nmbr()
{
    int res = 0;
    while(s[poz] >= '0' && s[poz] <= '9')
        res = res * 10 + (s[poz++] - '0');
    return res;
}

bool order(char s1, char s2)
{
    if(s1 == '(')
        return 1;
    if((s1 == '+' || s1 == '-') && (s2 == '*' || s2 == '/'))
        return 1;
    return 0;
}

int main()
{
    in >> s;

    int len = strlen(s);

    while(poz < len)
    {
        if(s[poz] == '(')
        {
            signs.push(s[poz++]);
            continue;
        }
        if(s[poz] == ')')
        {
            while(signs.top() != '(')
            {
                add();
                nrStiva --;
            }
            signs.pop();
            poz++;
            continue;
        }
        if(s[poz] == '+' || s[poz] == '-' || s[poz] == '*' || s[poz] == '/')
        {
            if(signs.empty() || order(signs.top(), s[poz]))
                signs.push(s[poz++]);
            else
            {
                if(nrStiva >= 2)
                {
                    do
                    {
                        add();
                        nrStiva --;
                    }
                    while(!signs.empty() && order(signs.top(), s[poz]));
                    signs.push(s[poz++]);
                    continue;
                }

            }
        }

        int nr = nmbr();
        numbers.push(nr);
        nrStiva++;
    }

    while(!signs.empty() && nrStiva >= 2)
    {
        add();
        nrStiva --;
    }
    out << numbers.top();
    return 0;
}