Cod sursa(job #1276089)

Utilizator cdascaluDascalu Cristian cdascalu Data 25 noiembrie 2014 22:20:38
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.5 kb
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <string.h>
#include <stack>
#include <algorithm>
#define Nmax 300001
using namespace std;

int priority(char x)
{
    if(x == '+')
        return 1;
    if(x == '-')
        return 2;
    if(x == '*')
        return 3;
    if(x == '/')
        return 4;
}
char* getPostfix(char* s)
{
    char res[Nmax];
    int sz = strlen(s), cnt = 0;
    bool is_number = false;

    stack<char> S;

    for(int i=0;i<sz;++i)
    {
        if(s[i] >= '0' && s[i] <= '9')
        {
            is_number = true;
            res[cnt++] = s[i];

        } else {

            if(is_number)
            {
                res[cnt++] = ' ';
                is_number = false;
            }

            if(s[i] == '(')
            {
                S.push(s[i]);
                continue;
            }
            if(s[i] == ')')
            {
                while(S.top() != '(')
                {
                    res[cnt++] = S.top();
                    S.pop();
                }
                S.pop();
                continue;
            }

            while(!S.empty() && S.top() != '(' && S.top() != ')' && priority(s[i]) < priority(S.top()))
            {
                res[cnt++] = S.top();
                S.pop();
            }
            S.push(s[i]);
        }
    }

    while(!S.empty())
    {
        res[cnt++] = S.top();
        S.pop();
    }

    return res;
}

int evaluatePostfix(char *res)
{
    int sz = strlen(res), nr = 0, sol = 0;
    bool is_number = false;

    stack<int> S;
    for(int i=0;i<sz;++i)
    {
        if(res[i] >= '0' && res[i] <= '9')
        {
            is_number = true;
            nr = nr * 10 + (res[i] - '0');
        } else {

            if(is_number)
            {
                S.push(nr);
                nr = 0;
                is_number = false;
            }

            if(res[i] == ' ')
                continue;

            int y = S.top(); S.pop();
            int x = S.top(); S.pop();

            if(res[i] == '+')
            {
                S.push(x+y);
            } else if(res[i] == '*')
                S.push(x*y);
            else if(res[i] == '-')
                S.push(x-y);
            else if(res[i] == '/')
            {
                S.push(x/y);
            }
        }
    }

    return S.top();
}
int main()
{
    char buf[Nmax];
    ifstream f("evaluare.in");
    f.getline(buf, Nmax);
    f.close();

    ofstream g("evaluare.out");
    g<<evaluatePostfix(getPostfix(buf));
    g.close();
    return 0;
}