Cod sursa(job #2003390)

Utilizator roitainNiculae Cristian roitain Data 22 iulie 2017 20:17:11
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.57 kb
#include<iostream>
#include<vector>
#include<stack>
#include<cstring>
#include<cstdio>
using namespace std;

struct element{
    char op;
    int number;
}*p;

int priority(char a){
    // 3 high priority - 2 medium priority - 1 low priority
    if(a=='(' || a==')')
        return 3;
    if(a=='*' || a=='/')
        return 2;
    else return 1;
}

bool isOperator(char a){
    if(strchr("()*/+-",a))
        return 1;
}

string infix;
vector<element> postfix;
stack<element> order;

int main(){
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    cin>>infix;

    int N = infix.size();

    for(int i = 0; i < N;){

        while(infix[i] == ' ')
            ++i;

        if(!isOperator(infix[i])){

            p = new element();
            p->number = infix[i++] - '0';
            while(!isOperator(infix[i]))
                p->number = p->number * 10 + infix[i++] - '0';

            postfix.push_back(*p);

        }else if(infix[i] == '('){
            p = new element();
            p->op = '(';

            order.push(*p);
            ++i;

        }else if(infix[i] == ')'){
            while(order.top().op != '('){
                postfix.push_back(order.top());
                order.pop();
            }
            order.pop();
            ++i;

        }else if(isOperator(infix[i])){
            if(order.empty()){
                p = new element();
                p->op = infix[i];
                order.push(*p);

            }else{
                while(!order.empty() && order.top().op != '(' && priority(order.top().op) >= priority(infix[i])){
                    postfix.push_back(order.top());
                    order.pop();
                }
                p = new element();
                p->op = infix[i];
                order.push(*p);

            }
            ++i;

        }
    }

    while(!order.empty()){
        postfix.push_back(order.top());
        order.pop();
    }

    int M = postfix.size();
    int a,b;
    stack<int> st;

    for(int i = 0; i < M; ++i){
        if(postfix[i].op != NULL){
            a = st.top();
            st.pop();
            b = st.top();
            st.pop();

            switch(postfix[i].op){
                case '+': st.push(a+b);break;
                case '-': st.push(b-a);break;
                case '*': st.push(b*a);break;
                case '/': st.push(b/a);break;
            }
        }else{
            st.push(postfix[i].number);
        }
    }

    cout<<st.top();

    return 0;
}