Cod sursa(job #2220800)

Utilizator AndreiOffCovaci Andrei-Ion AndreiOff Data 12 iulie 2018 15:56:37
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>
#include <deque>

using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");

char s[100005];

int x, n;

bool ok;

vector<char> st;

vector<int> rez;

void calculate(char ch){

    int b = 0, y = 0, z = 1;

    b = rez.back();
    rez.pop_back();

    y = rez.back();
    rez.pop_back();

        switch(ch){

        case '*':
            z = y*b;
            break;

        case '/':
            z = y/b;
            break;

        case '+':
            z = y + b;
            break;

        case '-':
            z = y - b;
            break;

        default : break;

        }

    rez.push_back(z);

}

int grade(char ch){

    switch(ch){

        case '/': return 3;
        case '*': return 3;
        case '-': return 2;
        case '+': return 2;
        default: break;

    }

    return 0;

}

int main()
{

f.getline(s, 100005);

n = strlen(s);

for(int i = 0; i < n; i++){

    while(s[i] >= '0' && s[i] <= '9' && i < n){

        ok = 1;
        x = x*10 + (s[i] - '0');
        i++;

    }

    if(ok){

        i--;

        rez.push_back(x);

        x = 0;

        ok = 0;

    }else{

        if(s[i] == '+' || s[i] == '-' || s[i] == '/' || s[i] == '*'){

            while(!st.empty() && st.back() != '(' && (grade(st.back()) > grade(s[i]) || (grade(st.back()) == grade(s[i])))){

                calculate(st.back());

                st.pop_back();

            }

            }

            if(s[i] == '(')
                st.push_back(s[i]);

            else if(s[i] == ')'){

                while(st.back() != '('){

                    calculate(st.back());

                    st.pop_back();

                }

                st.pop_back();

            }else st.push_back(s[i]);


    }


}

while(!st.empty()){

    calculate(st.back());

    st.pop_back();

}

g<<rez.back();

    return 0;
}