Pagini recente » Cod sursa (job #1134252) | Cod sursa (job #1328071) | Cod sursa (job #351245) | Cod sursa (job #1476966) | Cod sursa (job #2112170)
#include <bits/stdc++.h>
#define pb push_back
#define INF 0x3f3f3f
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
stack<int>pol,op,val;
string v;
int calc(int a, int b, int semn){
if(semn==-1) return a+b;
if(semn==-2) return a-b;
if(semn==-3) return a*b;
if(semn==-4) return a/b;
}
int isOperator(char a){
if(a=='+') return -1;
if(a=='-') return -2;
if(a=='*') return -3;
if(a=='/') return -4;
return 0;
}
inline int priority(int a){ return abs(a);}
bool isDigit(char a){
int aux = int(a-'0');
return (aux>=0 && aux<=9);
}
void parse(int &i){
int ans=0;
for(;i<v.size() && isDigit(v[i]);++i){
ans=ans*10+int(v[i]-'0');
}
pol.push(ans); i--;
}
void clearOp(bool close){
while(!op.empty()){
if(op.top() == INF){
if(close) op.pop();
return;
}
pol.push(op.top());
op.pop();
}
}
void makePol(){
for(int i=0;i<v.size();++i){
if(v[i]=='(') op.push(INF);
else if(v[i]==')') clearOp(1);
else if(isOperator(v[i])){
while(!op.empty() && op.top()!=INF && priority(isOperator(v[i]))<priority(op.top())){
pol.push(op.top()); op.pop();
}
op.push(isOperator(v[i]));
}
else if(isDigit(v[i])) parse(i);
}
clearOp(0);
}
int getAns(){
int semn = pol.top(); pol.pop();
if(semn>0) return semn;
int op1=-1, op2=-1;
while(op1==-1 || op2==-1){
if(pol.top()>0){
if(op2==-1) op2=pol.top();
else op1=pol.top();
pol.pop();
} else {
if(op2==-1) op2=getAns();
else if(op1==-1) op1=getAns();
}
}
cout<<op1<<" "<<op2<<" "<<semn<<'\n';
return calc(op1,op2,semn);
}
int main()
{
fin>>v;
makePol();
fout<<getAns();
return 0;
}