题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
CSDN显示可能有问题,不允许外链转存,大家可以在我的博客中阅读:My Blog
##解析思路
本题也是对于栈的较为直接的考察,我们可以直接选择建立一个栈来存储我们的每次输入的数字,然后遇到一个符号就弹出两个数来进行运算,运算的结果再入栈,最后运算结束之后,栈中只会剩下最后一个数,就是我们的结果。
注意这里面我们读取数字的时候是以字符串读取的,有可能会读取多位数比如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;
}
实际上格式化之后,发现本题难度并不大。