Pagini recente » Cod sursa (job #2344244) | Cod sursa (job #2068329) | Cod sursa (job #1885688) | Cod sursa (job #758818) | Cod sursa (job #2741251)
#include <bits/stdc++.h>
#define scanf (void)!scanf
using namespace std;
inline void Open(const string Name) {
#ifndef ONLINE_JUDGE
(void)!freopen((Name + ".in").c_str(), "r", stdin);
(void)!freopen((Name + ".out").c_str(), "w", stdout);
#endif
}
bool delim(char c) {
return c == ' ';
}
bool is_op(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
int priority(char op) {
if(op == '+' || op == '-')
return 1;
if(op == '*' || op == '/')
return 2;
return -1;
}
void process_op(stack <int> &st, char op) {
int r = st.top(); st.pop();
int l = st.top(); st.pop();
switch(op) {
case '+' : st.push(l + r); break;
case '-' : st.push(l - r); break;
case '*' : st.push(l * r); break;
case '/' : st.push(l / r); break;
}
}
int evaluate(const char s[]) {
stack <int> st;
stack <char> op;
for(int i = 0;s[i];i++) {
if(delim(s[i])) continue;
if(s[i] == '(') {
op.push('(');
} else if(s[i] == ')') {
while(op.top() != '(') {
process_op(st, op.top());
op.pop();
}
op.pop();
} else if(is_op(s[i])) {
char cur_op = s[i];
while(!op.empty() && priority(op.top()) >= priority(cur_op)) {
process_op(st, op.top());
op.pop();
}
op.push(cur_op);
} else {
int number = 0;
while(s[i] && isalnum(s[i]))
number = number * 10 + s[i++] - '0';
i--;
st.push(number);
}
}
while(!op.empty()) {
process_op(st, op.top());
op.pop();
}
return st.top();
}
int main() {
Open("evaluare");
char s[100001];
scanf("%s", s);
printf("%d", evaluate(s));
}