Pagini recente » Profil roxana.radu | Istoria paginii utilizator/deutu12345 | Cod sursa (job #778900) | Rating Orz el (Orzel) | Cod sursa (job #2003390)
#include<iostream>
#include<vector>
#include<stack>
#include<cstring>
#include<cstdio>
using namespace std;
struct element{
char op;
int number;
}*p;
int priority(char a){
// 3 high priority - 2 medium priority - 1 low priority
if(a=='(' || a==')')
return 3;
if(a=='*' || a=='/')
return 2;
else return 1;
}
bool isOperator(char a){
if(strchr("()*/+-",a))
return 1;
}
string infix;
vector<element> postfix;
stack<element> order;
int main(){
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
cin>>infix;
int N = infix.size();
for(int i = 0; i < N;){
while(infix[i] == ' ')
++i;
if(!isOperator(infix[i])){
p = new element();
p->number = infix[i++] - '0';
while(!isOperator(infix[i]))
p->number = p->number * 10 + infix[i++] - '0';
postfix.push_back(*p);
}else if(infix[i] == '('){
p = new element();
p->op = '(';
order.push(*p);
++i;
}else if(infix[i] == ')'){
while(order.top().op != '('){
postfix.push_back(order.top());
order.pop();
}
order.pop();
++i;
}else if(isOperator(infix[i])){
if(order.empty()){
p = new element();
p->op = infix[i];
order.push(*p);
}else{
while(!order.empty() && order.top().op != '(' && priority(order.top().op) >= priority(infix[i])){
postfix.push_back(order.top());
order.pop();
}
p = new element();
p->op = infix[i];
order.push(*p);
}
++i;
}
}
while(!order.empty()){
postfix.push_back(order.top());
order.pop();
}
int M = postfix.size();
int a,b;
stack<int> st;
for(int i = 0; i < M; ++i){
if(postfix[i].op != NULL){
a = st.top();
st.pop();
b = st.top();
st.pop();
switch(postfix[i].op){
case '+': st.push(a+b);break;
case '-': st.push(b-a);break;
case '*': st.push(b*a);break;
case '/': st.push(b/a);break;
}
}else{
st.push(postfix[i].number);
}
}
cout<<st.top();
return 0;
}