[算法设计题] 计算后缀表达式

计算后缀表达式

题目

从键盘上输入一个后缀表达式,规定:后缀表达式长度不超过一行,以’$'结束操作数之间用空格分割。且操作符只有 + - * / 四种。
后缀表达式:234 34 + 2 *$

算法思想

  1. 后缀表达式已经存在符号优先级,不需要再次考虑运算符的优先级,从左往右扫描即可。
  2. 具体的实现步骤大致如下:
  3. 初始化一个储存数字及中间结果的栈(opnd)
  4. 从左往右扫描表达式 [操作数,运算符,$ ]
    4.1. 遇到操作数,进栈
    4.2. 遇到运算符,从栈里取出两个栈顶元素(取出栈最上面的两个数)。顺序:先出的放运算符的右边,后出来的放运算符的左边,按运算符运算,结果放入(opnd)栈里。
  5. 循环4直到遇到’$'结束,此时的栈里只有一位元素,就是表达式的值

有些数字是带有小数的,解决方法:

  1. 把读入的数字或者小数点(.)依次保存在一个字符串数组中。
  2. 利用atof(ArrayName)将字符串数组转换为一个浮点数

算法描述[算法设计题]

double Postfix() {
	InitStack(opnd);//初始化一个栈
	double num = 0.0;//操作数初始化
	ch = getchar();//获取表达式的第一个字符
	while (ch != '$') {//循环扫描表达式
		i = 0; //
		while ((ch >= '0' && ch <= '9') || ch == '.' ) {
			data[i] = ch;
			i++;
			ch = getchar();
		}
		num = atof(data);//把字符数组的数字转换为浮点数
		Push(opnd, num); //入栈
		switch (ch) {
			case '+':
				Pop(opnd, b);
				Pop(opnd, a);
				Posh(opnd,a+b);
				break;
			case '-':
				Pop(opnd, b);
				Pop(opnd, a);
				Posh(opnd,a-b);
				break;
			case '*':
				Pop(opnd, b);
				Pop(opnd, a);
				Posh(opnd,a*b);
				break;
			case '/':
				Pop(opnd, b);
				Pop(opnd, a);
				Posh(opnd,a/b);
				break;
		}
		ch = getchar();//读表达式的下一个元素
	}
	return getTop(opnd);//输出栈里的唯一元素(输出结果)
}

说明算法的主要代码,并在关键处添加上注释。无需具体实现。

  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小源同学r

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值