我用栈写,一个栈保存符号,一个栈保存数字。
有个技巧是再添加一个结束符'#'.然后根据优先级来进行计算即可。
如果有括号的话再加一个优先级比较的数组即可。
至于优先级,首先是普通认知的优先级,然后相同优先级前者的大于后者。
左括号小于任何,又括号大于任何。
#include <iostream>
#include <vector>
#include <stack>
#include <cstring>
#include <cstdio>
using namespace std;
stack<double> OPN;//restore the num
stack<char> OPO;//restore the operation
/*
1 is prior
0 is equal
-1 is lower
*/
int op[200][200];
void init(){
while(!OPN.empty())
OPN.pop();
while(!OPO.empty())
OPO.pop();
OPO.push('#');
op['+']['+']=1;op['+']['-']=1;op['+']['*']=-1;op['+']['/']=-1;
op['-']['+']=1;op['-']['-']=1;op['-']['*']=-1;op['-']['/']=-1;
op['*']['+']=1;op['*']['-']=1;op['*']['*']=1; op['*']['/']=1;
op['/']['+']=1;op['/']['-']=1;op['/']['*']=1; op['/']['/']=1;
op['+']['#']=1;op['-']['#']=1;op['*']['#']=1; op['/']['#']=1;
op['#']['+']=-1;op['#']['-']=-1;op['#']['*']=-1; op['#']['/']=-1;
}
bool in(char c){
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='#'||c==' ')
return true;
return false;
}
double operate(double s1,double s2,char opp){
switch(opp){
case '+':
return s1+s2;
case '-':
return s1-s2;
case '*':
return s1*s2;
case '/':
return s1/s2;
}
return 0;
}
int main(){
char str[250];
while(gets(str)){
init();
double s=0;
int len=strlen(str);
if(str[0]=='0'&&len==1)
return 0;
str[len]='#';
str[len+1]='\0';
// puts(str);
int i=0;
bool f=0;
while(str[i]!='#'||OPO.top()!='#'){
if(str[i]==' ') { i++;continue;}
while(!in(str[i])){
f=1;
s=s*10+(str[i]-'0');
//printf("%lf\n",s);
i++;
}
if(f){
OPN.push(s);
s=0;
f=0;
continue;
}
char t_op=OPO.top();
if(op[(int)t_op][(int)str[i]]==1){
double _s=OPN.top();
OPN.pop();
double s_=OPN.top();
OPN.pop();
// printf("%lf %lf \n",_s,s_);
double temp=operate(s_,_s,t_op);
OPN.push(temp);
OPO.pop();
// OPO.push(str[i]);
}
else if(op[(int)t_op][(int)str[i]]==-1){
OPO.push(str[i]);
i++;
}
}
double ans=OPN.top();
printf("%.2lf\n",ans);
}
return 0;
}