Pagini recente » Cod sursa (job #2972733) | Cod sursa (job #811967) | Cod sursa (job #2323326) | Cod sursa (job #1981161) | Cod sursa (job #2979534)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
const int kN = 1e5 + 5;
char stkOp[kN], s[kN];
int stkNumbers[kN], n, op;
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]] = b - a; 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.getline(s, 100001);
n = (int)strlen(s);
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]];
}