Cod sursa(job #2418091)

Utilizator lessanleonard savu lessan Data 3 mai 2019 16:03:59
Problema Evaluarea unei expresii Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.12 kb
#include <fstream>
#include <iostream>
#include <string>
#include <stack>
using namespace std;

struct operatorStackElement{
    char op;
    int priority;
};

int main(){

    string sirExpresie;
    ifstream fin ("evaluare.in");
    ofstream fout ("evaluare.out");
    getline(fin, sirExpresie);
    int currentPriority = 0;

    stack<int> numberStack;
    stack<struct operatorStackElement> operatorStack;

    for (string::iterator it = sirExpresie.begin(), end = sirExpresie.end(); it != end; it++){

        if(*it == '('){
            currentPriority += 2;
            continue;
        }

        if(*it == ')'){
            currentPriority -= 2;
            continue;
        }
       
        if(*it >= '0' && *it <= '9'){
            int number = *it - '0';
            it++;
            while(*it >= '0' && *it <= '9'){
                number *= 10;
                number += *it - '0';
                it++;
            }
            it--;
            numberStack.push(number);
            continue;
        }

        int priorityToInsert = currentPriority;

        if(*it == '-' || *it == '+')
            priorityToInsert += 1;
        else if(*it == '*' || *it == '/')
            priorityToInsert += 2;
        
        operatorStackElement newElement = {*it, priorityToInsert};

        if(!operatorStack.empty()){
            operatorStackElement oldElement = operatorStack.top();
            if(newElement.priority <= oldElement.priority){
                operatorStack.pop();
                int number1 = numberStack.top();
                numberStack.pop();
                int number2 = numberStack.top();
                numberStack.pop();
                int number;
                switch(oldElement.op){
                    case '+':
                        number = number1 + number2;
                        break;
                    case '-':
                        number = number2 - number1;
                        break;
                    case '*':
                        number = number1*number2;
                        break;
                    case '/':
                        number = number2/number1;
                        break;
                }
                numberStack.push(number);
            }
            operatorStack.push(newElement);
        }else{
            operatorStack.push(newElement);
        }
    }

     while(!operatorStack.empty()){
            int number1 = numberStack.top();
            numberStack.pop();
            int number2 = numberStack.top();
            numberStack.pop();
            int number;
            switch(operatorStack.top().op){
                case '+':
                    number = number1 + number2;
                    break;
                case '-':
                    number = number2 - number1;
                    break;
                case '*':
                    number = number1*number2;
                    break;
                case '/':
                    number = number2/number1;
                    break;
            }
            numberStack.push(number);
            operatorStack.pop();
    }

    fout<<numberStack.top();
    numberStack.pop();
    return 0;
}