Pagini recente » Cod sursa (job #273167) | Cod sursa (job #3253813) | Cod sursa (job #1673761) | Cod sursa (job #323258) | Cod sursa (job #2979530)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
const int kN = 1e5 + 5;
char stkOp[kN];
int stkNumbers[kN], n, op;
string s;
void calculate (char ch){
int a = stkNumbers[stkNumbers[0]];
--stkNumbers[0];
int b = stkNumbers[stkNumbers[0]];
--stkNumbers[0];
switch (ch){
case '+' : stkNumbers[++stkNumbers[0]] = a + b; break;
case '-' : stkNumbers[++stkNumbers[0]] = a - b; break;
case '*' : stkNumbers[++stkNumbers[0]] = a * b; break;
case '/' : stkNumbers[++stkNumbers[0]] = b / a; break;
}
}
int priority (char ch){
if (ch == '+' || ch == '-'){
return 1;
}
if (ch == '/' || ch == '*'){
return 2;
}
return -1;
}
int main(){
ios_base::sync_with_stdio(false);
fin >> s;
n = (int)s.size();
for (int i = 0; i < n; i++){
if (isdigit(s[i])){
int number = 0;
while (i < n && isdigit(s[i])){
number = number * 10 + (s[i] - '0');
++i;
}
stkNumbers[++stkNumbers[0]] = number;
--i;
}
else if (strchr("+-/*", s[i])){
while (op > 0 && priority(stkOp[op]) >= priority(s[i])){
calculate(stkOp[op]);
--op;
}
stkOp[++op] = s[i];
}
else if (s[i] == '(' || s[i] == ')'){
if (s[i] == '('){
stkOp[++op] = s[i];
}
else{
while (stkOp[op] != '('){
calculate(stkOp[op]);
--op;
}
--op;
}
}
}
while (op > 0){
calculate(stkOp[op]);
--op;
}
fout << stkNumbers[stkNumbers[0]];
}