Pagini recente » Cod sursa (job #2782396) | Cod sursa (job #723847) | Cod sursa (job #1249448) | Cod sursa (job #35379) | Cod sursa (job #3274943)
#include <iostream>
#include <fstream>
#include <string.h>
#include <stack>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char sir[100001];
int rang(char op) {
if (op == '+' || op == '-')
return 0;
if (op == '*' || op == '/')
return 1;
return -1; // pentru '('
}
int isoperation(char c) {
if (c == '+' || c == '-' || c == '*' || c == '/')
return 1;
return 0;
}
void eval(stack<int>& s, char op) {
int dr = s.top(); s.pop();
int st = s.top(); s.pop();
switch (op) {
case '+': s.push(st + dr);
break;
case '-': s.push(st - dr);
break;
case '*': s.push(st * dr);
break;
case '/': s.push(st / dr);
break;
}
}
int main()
{
fin.getline(sir, 100001);
int n = strlen(sir);
stack<int> s;
stack<char> op;
for (int i = 0; i < n; i++) {
if (isdigit(sir[i])) {
int nr = 0;
while (i < n && isdigit(sir[i])) {
nr = nr * 10 + sir[i] - '0';
i++;
}
i--;
s.push(nr);
}
else if (sir[i] == '(') {
op.push('(');
}
else if (isoperation(sir[i])) {
char o = sir[i];
while (!op.empty() && rang(o) <= rang(op.top())) {
eval(s, op.top());
op.pop();
}
op.push(o);
}
else {
while (op.top() != '(') {
eval(s, op.top());
op.pop();
}
op.pop();
}
}
while (!op.empty()) {
eval(s, op.top());
op.pop();
}
fout << s.top();
return 0;
}