Pagini recente » Cod sursa (job #3160960) | Cod sursa (job #2737733) | Cod sursa (job #912558) | Cod sursa (job #991472) | Cod sursa (job #2418091)
#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;
}