数据结构与算法题目集7-21 求前缀表达式的值(c语言实现)

原题链接

  1. 首先我们将所有数据压到一个栈里,包括运算符号和数字。在这个题里我重新定义了一种变量类型。当no=1时,这个变量存储doule类型的数字,否则存储运算符。
  2. 从栈顶开始,如果是数字,压到一个double类型的栈里,如果是运算符,从double栈里取两个数字进行计算。若令a为double栈顶数字,b为栈顶的下一个数字,那么令c=a运算符b,并将c压到double栈。

大致思想如上所示,在代码中我会给出重要语句的注释,ac代码如下:

#include 
#include 
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]);
}

你可能感兴趣的:(堆栈,PTA数据结构与算法题目集,字符串,数据结构,算法)