Pagini recente » Cod sursa (job #2156387) | Cod sursa (job #1869520) | Cod sursa (job #3356161) | Cod sursa (job #3325005) | Cod sursa (job #3342968)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int priority(char x){
if(x == '/' || x == '*') return 2;
if(x == '+' || x == '-') return 1;
return 0;
}
int operation(int a, int b, char operation){
if(operation == '+') return a + b;
if(operation == '-') return a - b;
if(operation == '/') return a / b;
if(operation == '*') return a * b;
return 0;
}
vector<string> convert_to_reverse_polish_notation(string expression){
vector<string> result;
stack<char> operations;
for(int i = 0; i < expression.size(); i++){
char current_symbol = expression[i];
if(isdigit(current_symbol)){
string new_number;
while(i < expression.size() && isdigit(expression[i])){
new_number += expression[i];
i++;
}
i--;
result.push_back(new_number);
}
else if(current_symbol == '('){
operations.push(current_symbol);
}
else if(current_symbol == ')'){
while(!operations.empty() && operations.top() != '('){
result.push_back(string(1, operations.top()));
operations.pop();
}
operations.pop();
}
else{
while(!operations.empty() && priority(operations.top()) >= priority(current_symbol)){
result.push_back(string(1, operations.top()));
operations.pop();
}
operations.push(current_symbol);
}
}
while(!operations.empty()){
result.push_back(string(1, operations.top()));
operations.pop();
}
return result;
}
int evaluate_expression(string expression){
vector<string> postfix_expression = convert_to_reverse_polish_notation(expression);
stack<int> numbers;
for(int i = 0; i < postfix_expression.size(); i++){
if(isdigit(postfix_expression[i][0])){
numbers.push(stoi(postfix_expression[i]));
}
else{
int a = numbers.top();
numbers.pop();
int b = numbers.top();
numbers.pop();
numbers.push(operation(b, a, postfix_expression[i][0]));
}
}
return numbers.top();
}
int main()
{
string expression;
fin>>expression;
int result = evaluate_expression(expression);
fout<<result;
return 0;
}