链接:点击打开链接
题意:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
代码:
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int change(char c){
if(c=='+')
return -1;
else if(c=='-')
return -2;
else if(c=='*')
return -3;
return -4;
}
double cal(double a,double b,int op){
if(op==-1)
return a+b;
else if(op==-2)
return a-b;
else if(op==-3)
return a*b;
return a/b;
}
int G[4][4]={ //定义栈内优先级
0,0,1,1,
0,0,1,1,
0,0,0,0,
0,0,0,0
};
int main(){
char s[205];
double a,b;
int i,j,k,op1,op2,ans,len;
while(gets(s)&&strcmp(s,"0")!=0){
stack<int> sa;
vector<int> ss;
stack<double> sb;
len=strlen(s);
ans=0,s[len]=' ',s[++len]='\0';
for(i=0;s[i];i++){
if(s[i]==' ')
continue;
if(s[i]>='0'&&s[i]<='9'){
ans=ans*10+s[i]-'0'; //要注意不光有一位数
if(s[i+1]==' '){
ss.push_back(ans);
ans=0;
}
}
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){
if(sa.size()==0){
sa.push(change(s[i]));
continue;
}
while(sa.size()){
op1=change(s[i]);
op2=sa.top();
if(G[op1+4][op2+4]==1){
sa.push(op1);
break;
}
else{
ss.push_back(op2);
sa.pop();
}
}
if(sa.size()==0)
sa.push(op1);
}
}
while(sa.size()){
ss.push_back(sa.top());
sa.pop();
} //中序表达式转后续表达式
for(i=0;i<ss.size();i++){ //求出后缀直接计算
if(ss[i]>=0)
sb.push(ss[i]*1.0);
else{
a=sb.top();
sb.pop();
b=sb.top();
sb.pop();
sb.push(cal(b,a,ss[i]));
}
}
printf("%.2lf\n",sb.top());
}
return 0;
}