Cod sursa(job #1461689)

Utilizator Burbon13Burbon13 Burbon13 Data 16 iulie 2015 11:40:42
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.42 kb
#include <cstdio>
#include <cctype>
#include <cstdlib>
#include <stack>
#include <cstring>
using namespace std;

const int nmx = 100005;

char s[nmx], pol[nmx][12];
int nr ;

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

void forma_poloneza() {
    stack <char> st;
    st.push('(');
    int lun = strlen(s) + 1;
    s[lun-1] = ')';
    for(int i = 0; i < lun; ++i) {
        if(s[i] == '(') {
            st.push('(');
            continue;
        }
        if(s[i] == ')') {
            while(not st.empty() && st.top() != '(') {
                pol[nr++][0] = st.top();
                st.pop();
            }
            st.pop();
            continue;
        }
        if(isdigit(s[i])) {
            int pos = 0;
            while(isdigit(s[i]))
                pol[nr][pos++] = s[i++];
            -- i;
            ++ nr;
            continue;
        }
        while(not st.empty() && prioritate(st.top()) > prioritate(s[i])) {
            pol[nr++][0] = st.top();
            st.pop();
        }
        st.push(s[i]);
    }
}

int eval_expresie(){
    int val1, val2, pos;
    stack <int> st;
    for(int i = 0; i < nr; ++i)
        if(isdigit(pol[i][0])){
            val1 = 0;
            pos = 0;
            while(pol[i][pos] >= '0' && pol[i][pos] <= '9')
                val1 = val1 * 10 + (int)pol[i][pos++] - 48;
            st.push(val1);
        }
        else if(pol[i][0] == '+'){
            val1 = st.top();
            st.pop();
            val2 = st.top();
            st.pop();
            st.push(val1 + val2);
        }
        else if(pol[i][0] == '-'){
            val1 = st.top();
            st.pop();
            val2 = st.top();
            st.pop();
            st.push(val2 - val1);
        }
        else if(pol[i][0] == '*'){
            val1 = st.top();
            st.pop();
            val2 = st.top();
            st.pop();
            st.push(val1 * val2);
        }
        else{
            val1 = st.top();
            st.pop();
            val2 = st.top();
            st.pop();
            st.push(val2 / val1);
        }
    return st.top();
}

int main() {
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);
    scanf("%s", s);
    forma_poloneza();
    printf("%d\n", eval_expresie());
    return 0;
}