算法刷题之栈系列P1449-后缀表达式

题目描述


所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。

如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。

CSDN显示可能有问题,不允许外链转存,大家可以在我的博客中阅读:My Blog

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tkmtd2dD-1628094780336)(https://z3.ax1x.com/2021/08/04/fELUWd.png)]

##解析思路


本题也是对于栈的较为直接的考察,我们可以直接选择建立一个栈来存储我们的每次输入的数字,然后遇到一个符号就弹出两个数来进行运算,运算的结果再入栈,最后运算结束之后,栈中只会剩下最后一个数,就是我们的结果。

注意这里面我们读取数字的时候是以字符串读取的,有可能会读取多位数比如13、122这种,所以需要注意读取问题,不过这一题还算简单,没有让我们读取负数

代码


代码如下:

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

int main()
{
	int stack[1000];  // 用来放置相关数字的栈
	char ch;  // 读入字符
	int top = 0; //记录栈目前的栈顶位置
	while ((ch = getchar()) != '@')
	{
		if (ch <= '9' && ch >= '0')
		{
			int num;  // 用来做读取的每一个数字
			num = ch - '0';
			while ((ch = getchar()) != '\.')  // 如果是数字的话
			{
				num *= 10;
				num += ch - '0';
			}
			stack[top++] = num;  // 入栈
			// printf("%d", num);
		}
		else   // 如果是运算符就出栈运算然后入栈
		{
			int right = stack[--top], left = stack[--top];  // 得到左右操作数

			switch (ch)
			{
			case'*': stack[top++] = left * right; break;
			case'/': stack[top++] = left / right; break;
			case'+': stack[top++] = left + right; break;
			case'-': stack[top++] = left - right; break;
			default:break;
			}
		}
		// printf("top : %d\n", stack[top - 1]);
	}
	printf("%d", stack[0]);
	return 0;
}

实际上格式化之后,发现本题难度并不大。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值