Pagini recente » Cod sursa (job #1260400) | Cod sursa (job #3253421)
#include <iostream>
#include <fstream>
#include <stack>
#include <string>
#include <cctype>
#include <cmath>
using namespace std;
int elsoseg(char op) {
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return 0;
}
int muveletek(int a, int b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
}
return 0;
}
int kiertekeles(const string &e) {
stack<int> ertekek;
stack<char> ops;
for (size_t i = 0; i < e.length(); i++) {
if (isspace(e[i])) continue;
if (isdigit(e[i])) {
int val = 0;
while (i < e.length() && isdigit(e[i])) {
val = (val * 10) + (e[i] - '0');
i++;
}
ertekek.push(val);
i--;
}
else if (e[i] == '(') {
ops.push(e[i]);
}
else if (e[i] == ')') {
while (!ops.empty() && ops.top() != '(') {
int val2 = ertekek.top(); ertekek.pop();
int val1 = ertekek.top(); ertekek.pop();
char op = ops.top(); ops.pop();
ertekek.push(muveletek(val1, val2, op));
}
ops.pop();
}
else if (e[i] == '+' || e[i] == '-' ||e[i] == '*' || e[i] == '/') {
while (!ops.empty() && elsoseg(ops.top()) >= elsoseg(e[i])) {
int val2 = ertekek.top(); ertekek.pop();
int val1 = ertekek.top(); ertekek.pop();
char op = ops.top(); ops.pop();
ertekek.push(muveletek(val1, val2, op));
}
ops.push(e[i]);
}
}
while (!ops.empty()) {
int val2 = ertekek.top(); ertekek.pop();
int val1 = ertekek.top(); ertekek.pop();
char op = ops.top(); ops.pop();
ertekek.push(muveletek(val1, val2, op));
}
return ertekek.top();
}
int main() {
ifstream f("evaluare.in");
ofstream g("evaluare.out");
string e;
getline(f, e);
int megold = kiertekeles(e);
g << megold << endl;
f.close();
g.close();
return 0;
}