Pagini recente » Cod sursa (job #1802101) | Cod sursa (job #621610) | Cod sursa (job #1632986) | Cod sursa (job #2719023) | Cod sursa (job #2758904)
#include <fstream>
#include <string>
#include <stack>
#include <queue>
using namespace std;
struct ExpressionEntity {
bool isNumber = false;
char _operator = 0;
int _operand = 0;
};
inline bool isDigit(char c) {
return '0' <= c && c <= '9';
}
int main() {
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
string expression;
fin >> expression;
stack<char> s;
queue<ExpressionEntity> q;
for (int i = 0; i < expression.length(); i++) {
if (isDigit(expression[i])) {
int j = i;
while (isDigit(expression[i]))
i++;
ExpressionEntity e;
e.isNumber = true;
e._operand = stoi(expression.substr(j, i - j));
q.push(e);
i--;
}
else switch (expression[i]) {
case '(':
s.push('(');
break;
case ')':
while (s.top() != '(') {
ExpressionEntity e;
e._operator = s.top();
q.push(e);
s.pop();
}
s.pop();
break;
case '+':
case '-':
while (!s.empty() && s.top() != '(') {
ExpressionEntity e;
e._operator = s.top();
q.push(e);
s.pop();
}
s.push(expression[i]);
break;
case '*':
case '/':
while (!s.empty() && (s.top() == '*' || s.top() == '/')) {
ExpressionEntity e;
e._operator = s.top();
q.push(e);
s.pop();
}
s.push(expression[i]);
break;
}
}
while (!s.empty()) {
ExpressionEntity e;
e._operator = s.top();
q.push(e);
s.pop();
}
stack<ExpressionEntity> S;
while (!q.empty()) {
auto e = q.front();
q.pop();
if (e.isNumber)
S.push(e);
else {
int op2 = S.top()._operand;
S.pop();
int op1 = S.top()._operand;
S.pop();
int result = 0;
switch (e._operator) {
case '+':
result = op1 + op2;
break;
case '-':
result = op1 - op2;
break;
case '*':
result = op1 * op2;
break;
case '/':
result = op1 / op2;
break;
}
ExpressionEntity E;
E.isNumber = true;
E._operand = result;
S.push(E);
}
}
ExpressionEntity result = S.top();
fout << result._operand;
return 0;
}