Cod sursa(job #1561899)

Utilizator alexandru822Bosinta Alexandru alexandru822 Data 4 ianuarie 2016 17:37:53
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <fstream>
using namespace std;

char a[100000], b[300000];
char s[50000];
int number[50000];

int isOperator(char x)
{
    if(x == '+' || x == '-' || x == '*' || x == '/')
        return true;
    else return false;
}

int priority(char x)
{
    if(x == '*' || x == '/')
        return 2;
    if(x == '+' || x == '-')
        return 1;
    return 0;
}

int main()
{
    ofstream out("evaluare.out");
    ifstream in("evaluare.in");
    int size, j = 0, k = 0, t = 0;
    for(size = 0; in >> a[size]; size++);
    size--;
    for(int i = 0; i <= size;)
    {
        if(48<=a[i] && a[i] <= 57)
        {
            while(48 <=a [i] && a[i] <= 57)
                b[j++] = a[i++];
            b[j++] = ' ';
        }
        if(a[i] == '(')
            s[k++] = a[i++];
        if(a[i] == ')')
        {
            while(k != 0 && s[k-1] != '(')
            {
                b[j++] = s[--k];
                b[j++] = ' ';
            }
            i++;
        }
        if(isOperator(a[i]))
        {
            while(k != 0 && priority(s[k-1]) > priority(a[i]))
            {
                b[j++] = s[--k];
                b[j++] = ' ';
            }
            s[k++] = a[i++];
        }
    }
    while(k!=0)
    {
        if(s[--k] != '(')
            b[j++] = s[k];
        b[j++] = ' ';
    }
    for(int i = 0; i <= j; i++)
    {
        if(48 <= b[i] && b[i] <= 57)
        {
            int nr = 0;
            while(48 <= b[i] && b[i] <= 57)
                nr = nr*10 + b[i++] - '0';
            number[t++] = nr;
        }
        if(isOperator(b[i]))
        {
            int nr1 = number[--t];
            int nr2 = number[--t];
            switch(b[i])
            {
                case '+': nr1 = nr1+nr2; break;
                case '*': nr1 = nr1*nr2; break;
                case '/': nr1 = nr2/nr1; break;
                case '-': nr1 = nr2-nr1; break;
            }
            number[t++] = nr1;
        }
    }
    out << number[0];
    return 0;
}