Cod sursa(job #1462894)

Utilizator sorynsooSorin Soo sorynsoo Data 19 iulie 2015 13:24:56
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
//Evaluare expresie folosind forma poloneza, evaluez direct sirul fara sa formez in prealabil forma poloneza
#include <fstream>
#include <stack>
#include <vector>
#include <string.h>
using namespace std;

ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
#define MAXSIR 100005

char sir[MAXSIR],expr[MAXSIR][15];
int n;
stack<char> st;
stack<int> st_expr;

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

int calculeaza(int a, int b, char semn)
{
    if(semn=='+')
       return b+a;
    if(semn=='-')
       return b-a;
    if(semn=='*')
       return b*a;
    if(semn=='/')
       return b/a;
}

void procesare()
{
    int a=st_expr.top(); st_expr.pop();
    int b=st_expr.top(); st_expr.pop();
    st_expr.push( calculeaza(a,b,st.top()) );
    st.pop();
}

int eval_expr(char sir[])
{
    int lim,i,j;
    lim=strlen(sir);
    for(i=0; i<lim; i++)
    {
        //Pun in stiva cu semne
        if(sir[i]=='(')
        {
            st.push('(');
            continue;
        }

        //Pun in stiva cu numere
        if(isdigit(sir[i]))
        {
            int c=0,nr=0;
            while(isdigit(sir[i]))
                nr=nr*10+sir[i++]-'0';

            st_expr.push(nr);
            i--; n++;
            continue;
        }

        //Scot din stiva cu semne si calculez in cea cu numere
        if(sir[i]==')')
        {
            while(!st.empty() && st.top()!='(')
                procesare();

            st.pop();
            continue;
        }

        //Adaug in stiva cu semne si calculez in cea cu numere daca e nevoie
        if(sir[i]=='+' || sir[i]=='-' || sir[i]=='*' || sir[i]=='/')
        {
            while(!st.empty() && prioritate(st.top()) >= prioritate(sir[i]))
                procesare();
            st.push(sir[i]);
        }
    }
    while(!st.empty())
        procesare();

    return st_expr.top();
}

int main()
{
    cin.getline(sir,MAXSIR);
    cout<<eval_expr(sir);
}