Pagini recente » Cod sursa (job #1088600) | Cod sursa (job #295811) | Cod sursa (job #2333797) | Cod sursa (job #655312) | Cod sursa (job #1990904)
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <stack>
#include <cstring>
using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
#define ll long long
#define pb push_back
const int inf = 1e9 + 5;
const int NMax = 1e5 + 5;
int N,nrPost;
int prio[1<<9];
char str[NMax];
struct elem {
int nr;
char op;
elem (int _nr = 0,char _op = '\0') {
nr = _nr;
op = _op;
}
}post[NMax];
int main() {
in>>(str+1);
str[0] = '(';
str[N = strlen(str)] = ')';
prio['('] = 1;
prio['+'] = prio['-'] = prio[')'] = 2;
prio['*'] = prio['/'] = 3;
stack<char> ops;
for (int i=0;i <= N;++i) {
if (str[i] == '(') {
ops.push('(');
}
else if ('0' <= str[i] && str[i] <= '9') {
int nr = 0;
while ('0' <= str[i] && str[i] <= '9') {
nr = nr * 10 + str[i++] - '0';
}
--i;
post[++nrPost] = elem(nr);
}
else {
while (prio[ops.top()] >= prio[str[i]]) {
post[++nrPost] = elem(0,ops.top());
ops.pop();
}
if (str[i] == ')') {
ops.pop();
}
else {
ops.push(str[i]);
}
}
}
stack<int> nr;
for (int i=1;i <= nrPost;++i) {
//cout<<post[i].nr<<" "<<post[i].op<<'\n';
if (post[i].op == '\0') {
nr.push(post[i].nr);
}
else {
int nr1,nr2,ans;
char op = post[i].op;
nr1 = nr.top(); nr.pop();
nr2 = nr.top(); nr.pop();
switch (op) {
case '+': ans = nr2 + nr1; break;
case '-': ans = nr2 - nr1; break;
case '*': ans = nr2 * nr1; break;
case '/': ans = nr2 / nr1; break;
}
nr.push(ans);
}
}
out<<nr.top()<<'\n';
in.close();out.close();
return 0;
}