Pagini recente » Cod sursa (job #3250515) | Cod sursa (job #2431895) | Cod sursa (job #169260) | Cod sursa (job #1084727) | Cod sursa (job #1652416)
#include <algorithm>
#include <bitset>
#include <cmath>
#include <fstream>
#include <iostream>
#include <queue>
#include <stack>
#include <string.h>
#include <string>
#include <vector>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
inline int perform(int a, int b, int c) {
switch(c) {
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
case '/': return a/b;
default: return 0;
}
}
inline int prec(char x) {
if (x == '(' || x == ')')
return 0;
else if (x == '-' || x == '+')
return 1;
else
return 2;
}
int num = -1;
string A;
int main() {
fin >> A;
queue<int> Q; // output
stack<char> S; // operator stack
for(size_t i = 0; i < A.size(); ++i) {
if ('0' <= A[i] && A[i] <= '9') {
if (num < 0)
num = 0;
num = num * 10 + A[i] - '0';
}
else {
if (num >= 0)
Q.push(num), num = -1;
switch(A[i]) {
case '(': S.push('(');
break;
case ')': while(S.top() != '(') {
Q.push(-int(S.top()));
S.pop();
}
S.pop();
break;
case '-':
case '+': while(!S.empty() && prec(S.top()) >= 1) {
Q.push(-int(S.top()));
S.pop();
}
S.push(A[i]);
break;
case '*':
case '/': while(!S.empty() && prec(S.top()) >= 2) {
Q.push(-int(S.top()));
S.pop();
}
S.push(A[i]);
break;
}
}
}
if (num >= 0)
Q.push(num), num = -1;
while(!S.empty()) {
Q.push(-int(S.top()));
S.pop();
}
stack<int> R;
while(!Q.empty()) {
if(Q.front() >= 0) {
R.push(Q.front());
Q.pop();
} else {
char c = -Q.front();
Q.pop();
int b = R.top(); R.pop();
int a = R.top(); R.pop();
R.push(perform(a, b, c));
}
}
fout << R.top() << endl;
return 0;
}