- 首先我们将所有数据压到一个栈里,包括运算符号和数字。在这个题里我重新定义了一种变量类型。当no=1时,这个变量存储doule类型的数字,否则存储运算符。
- 从栈顶开始,如果是数字,压到一个double类型的栈里,如果是运算符,从double栈里取两个数字进行计算。若令a为double栈顶数字,b为栈顶的下一个数字,那么令c=a运算符b,并将c压到double栈。
大致思想如上所示,在代码中我会给出重要语句的注释,ac代码如下:
#include <stdio.h>
#include <string.h>
typedef struct{
int no;//no=1表示数字
double num;
char fh;
}stack;
int isnumber(char a){
if(a>='0' && a<='9'){
return 1;
}else{
return 0;
}
}
int main(){
char c[31];
int top=0,top1=0;
stack s[31];
double st[31];
while(scanf("%s",c)!=EOF){
//如果c[0]是数字或者c[0]不是数字而c[1]是数字都表示当前这个字符串表示的是数字
if(isnumber(c[0]) || !isnumber(c[0])&&isnumber(c[1])){
int len=strlen(c),t=1,q,i;
if(isnumber(c[0])){
i=0;
}else{
i=1;
}//从数字位开始计算
double p=0.1,num=0;
while(i<len){
if(t){
if(c[i]=='.'){
t=0;
}else{
num=num*10+(c[i]-'0');
}
}else{
num+=((c[i]-'0')*p);
p*=0.1;
}
i++;
}
s[top].no=1;
if(c[0]=='-'){
num=-num;
}//如果是个复数,要加上数字
s[top++].num=num;
}else{
s[top].fh=c[0];
s[top++].no=0;
}
}
while(top--){//循环如下语句直至栈空
if(s[top].no==1){//如果当前栈顶是一个数字,那么压入double类型的栈中
st[top1++]=s[top].num;
}else{//否则取double栈的两个数字进行计算,栈顶数字在前,下一个数字在后,这个顺序不能变
double a=st[--top1],b=st[--top1];
if(top1==-1){//如果double栈只有一个数组,那么退出循环
st[0]=a;
top1=1;
break;
}
if(s[top].fh=='+'){
a=a+b;
}else if(s[top].fh=='-'){
a=a-b;
}else if(s[top].fh=='*'){
a=b*a;
}else if(s[top].fh=='/'){
if(b==0){//如果次顶数字是0,那么输出错误
printf("ERROR");
return 0;
}else{
a=a/b;
}
}
st[top1++]=a;
}
}
printf("%.1f",st[top1-1]);
}