Pagini recente » Cod sursa (job #158914) | Cod sursa (job #1377589) | Cod sursa (job #1510207) | Cod sursa (job #1737984) | Cod sursa (job #1751366)
#include <iostream>
#include<stack>
#include<math.h>
#include<string.h>
using namespace std;
stack<char> operators;
stack<long long> factors;
void afiseaza(stack<long long > v){
while(!v.empty()){
long long a=v.top();
v.pop();
printf("%d ",a);
}
}
void solve_op_prcedence(){
while(!operators.empty()&&(operators.top()=='*'||operators.top()=='/')){
char op=operators.top();
operators.pop();
long long f1=factors.top();
factors.pop();
long long f2=factors.top();
factors.pop();
switch(op){
case '*':factors.push(f1*f2);break;
case '/':factors.push(f2/f1);
}
}
}
void solve_op_bracket(){
while(operators.top()!='('){
char op=operators.top();
operators.pop();
long long f1=factors.top();
factors.pop();
long long f2=factors.top();
factors.pop();
switch(op){
case '*':factors.push(f1*f2);break;
case '/':factors.push(f2/f1);break;
case '+':factors.push(f1+f2);break;
}
}
operators.pop();
}
void solve_rest(){
while(!operators.empty()){
char op=operators.top();
operators.pop();
long long f1=factors.top();
factors.pop();
long long f2=factors.top();
factors.pop();
//cout<<f2<<op<<f1<<endl;
switch(op){
case '*':factors.push(f1*f2);break;
case '/':factors.push(f2/f1);break;
case '+':factors.push(f1+f2);break;
}
}
}
int main() {
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
char* w=(char*)malloc(100000);
scanf("%s",w);
int j,last=0,opened=0;
for(int i=0;i<strlen(w);i++){
//cout<<w[i]<<" "<<i<<endl;
//afiseaza(factors);
switch(w[i]){
case '*':if(!operators.empty()&&operators.top()=='/')solve_op_prcedence();
operators.push(w[i]);break;
case '/':operators.push(w[i]);break;
case '+':
if(!operators.empty())
if((operators.top()=='*'||operators.top()=='/'))solve_op_prcedence();
operators.push(w[i]);break;
case '-':
if(!operators.empty()&&(operators.top()=='*'||operators.top()=='/'))solve_op_prcedence();
operators.push('+');last=1;break;
case '(':if(last==1)opened++;operators.push(w[i]);break;
case ')':if(last==1)opened--;last=opened%2==0?0:1;
solve_op_bracket();break;
default:
long long n=(w[i]-'0');
for(j=i+1;j<strlen(w);j++){
if(w[j]!='*'&&w[j]!='/'&&w[j]!='+'&&w[j]!='-'&&w[j]!='('&&w[j]!=')'){
n=n*10+(w[j]-'0');
}
else{
break;
}
}
i=j-1;
if(last==1&&opened%2==1){
//cout<<n<<"n"<<endl;
n=-n;
}else if(last==1&&opened==0){
last=0;
n=-n;
}
factors.push(n);
}
}
solve_rest();
afiseaza(factors);
}