Cod sursa(job #2759198)

Utilizator lahayonTester lahayon Data 16 iunie 2021 00:33:10
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.22 kb
#include <fstream>	
#include <string>
#include <stack>
#include <cmath>

using namespace std;

int precedence(char op){

    switch(op){
        case '^':
            return 3;
            break;
        case '*':
            return 2;
            break;
        case '/':
            return 2;
            break;
        case '+':
            return 1;
            break;
        case '-':
            return 1;
            break;
        default:
            return 0;
            break;
    }
}

void eval(stack<int>& calc, char op){
    int a = calc.top(); calc.pop();
    int b = calc.top(); calc.pop();
    int result;
    switch (op)
    {
    case '^':
        result = (int)pow(a, b);
        break;
    case '*':
        result = a * b;
        break;
    case '/':
        result = b / a;
        break;
    case '+':
        result = a + b;
        break;
    case '-':
        result = b - a;
        break;
    default:
        break;
    }
    calc.push(result);
}


int main(){
	
    ifstream cin("evaluare.in");
    ofstream cout("evaluare.out");
	
    string expr;
    cin >> expr;


    stack<int> calc;
    stack<char> postfix;

    for(int i = 0; i < expr.length(); ++i){

        if(expr[i] >= '0' && expr[i] <= '9'){
            int number = 0;
            while(expr[i] >= '0' && expr[i] <= '9' && i < expr.length()){
                number = number * 10 + expr[i] - '0';
                ++i;
            }
            --i;
            calc.push(number);
        }
        else if(expr[i] == '(')
            postfix.push(expr[i]);
        else if(expr[i] == ')'){
            while(postfix.top() != '('){
                eval(calc, postfix.top());
                postfix.pop();
            }
            postfix.pop();
        }
        else{
            while(!postfix.empty() && precedence(expr[i]) <= precedence(postfix.top())){
                eval(calc, postfix.top());
                postfix.pop();
            }
            postfix.push(expr[i]);
        }
    }
    while(!postfix.empty()){
        eval(calc, postfix.top());
        postfix.pop();
    }
    cout << calc.top();

    cin.close();
    cout.close();
	
    return 0;	
}