Mai intai trebuie sa te autentifici.
Cod sursa(job #1525251)
Utilizator | Data | 14 noiembrie 2015 21:31:32 | |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.11 kb |
#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <vector>
#include <cstring>
#include <cctype>
using namespace std;
#ifdef INFOARENA
#define ProblemName "evaluare"
#endif
#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif
template <class T> void readNum(T &nr) {
nr = 0;
T sign = 1;
char c;
while (!isdigit(c = getchar()))
(c == '-') && (sign = -1);
do {
nr = nr * 10 + c - '0';
} while (isdigit(c = getchar()));
nr *= sign;
}
#include <stack>
class _prec {
private:
vector<char> v;
public:
_prec() {
v.resize(255);
memset(&v[0], 0, sizeof(v[0]) * v.size());
v['('] = 1;
v['+'] = v['-'] = 2;
v['*'] = v['/'] = 3;
}
char operator()(char c) {
return v[c];
}
} prec;
int mat_eval(char op, int n1, int n2) {
switch (op)
{
case '+':
return n2 + n1;
case '-':
return n2 - n1;
case '*':
return n2 * n1;
case '/':
return n2 / n1;
default:
break;
}
return 0;
}
void mktree(stack<char>& S1, stack<int>& S2) {
char op = S1.top();
S1.pop();
int n1 = S2.top();
S2.pop();
int n2 = S2.top();
S2.pop();
S2.push(mat_eval(op, n1, n2));
}
void parseinput() {
char c;
stack<char> S1; stack<int> S2;
int curNr = 0; bool inNr = false;
while ((c = getchar()) && !feof(stdin)) {
if (c <= '9' && c >= '0') {
curNr = curNr * 10 + c - '0';
inNr = true;
continue;
}
if (inNr) {
S2.push(curNr);
curNr = 0;
inNr = false;
}
if (c == '(')
S1.push(c);
else if (prec(c)) {
while (!S1.empty() && prec(c) <= prec(S1.top()))
mktree(S1, S2);
S1.push(c);
}
else if (c == ')') {
while (S1.top() != '(')
mktree(S1, S2);
S1.pop();
}
}
if (inNr) {
S2.push(curNr);
curNr = 0;
inNr = false;
}
while (!S1.empty())
mktree(S1, S2);
printf("%d\n", S2.top());
S2.pop();
}
int main() {
assert(freopen(InFile, "r", stdin));
assert(freopen(OuFile, "w", stdout));
parseinput();
return 0;
}