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

原题链接

  1. 首先我们将所有数据压到一个栈里,包括运算符号和数字。在这个题里我重新定义了一种变量类型。当no=1时,这个变量存储doule类型的数字,否则存储运算符。
  2. 从栈顶开始,如果是数字,压到一个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]);
}
  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值