目录
1.题目描述
Kunkun学长觉得应该让学弟学妹了解一下这个知识点:后缀表达式相对于中缀表达式更容易让计算机理解和学习。
现在kunkun学长给出一串后缀表达式,你能帮他算出这个后缀表达式的值吗?
第一行输入后缀表达式长度n(1<=n<=25000);
第二行输入一个字符串表示后缀表达式
(每个数据或者符号之间用逗号隔开,保证输入的后缀表达式合法,每个数包括中间结果保证不超过long long长整型范围)
2.输入输出
输入样例:
14
2,10,2,+,6,/,-
输出样例:
0
3.解题思路
后缀表达式,本质上就是给计算机读取的语言。
后缀表达式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。
规则:从左向右扫描,遇到数字压栈,遇到操作符,弹出栈顶的两个元素,先弹出的元素在右边,后弹出来的在左边,进行计算后,将结果压栈,再往后扫描,直到扫描结束,输出栈顶元素,即为最终结果。
4.样例解析
下面以 14 2,10,2,+,6,/,-为例子来讲讲计算机的转换过程。
1. 首先读入 14 ,表示一共有14个字符
2.从左向右开始遍历表达式,首先遇到2, 将其入栈
栈的情况:2
3.从左向右开始遍历表达式,然后遇到10, 将其入栈
栈的情况:2,10
4.从左向右开始遍历表达式,然后遇到2, 将其入栈
栈的情况:2,10,2
5.从左向右开始遍历表达式,然后遇到+, 取出 2 和 10, 计算出 2 + 10 = 12,将12入栈
栈的情况:2,12
6.从左向右开始遍历表达式,然后遇到6, 将其入栈
栈的情况:2,12,6
7.从左向右开始遍历表达式,然后遇到 / , 取出10 和 6, 计算出 10 / 6 = 2 ,将 2 入栈
栈的情况:2,2
8.从左向右开始遍历表达式,然后遇到 - , 取出2 和 2, 计算出 2 - 2 = 0 ,将 0 入栈
栈的情况:0 (最后结果)
5.代码实现
🌈 5.1 数字情况
将其整个数字遍历,然后计算出数字的真实大小
if(s[i] >= '0' && s[i] <= '9') { int j = i + 1; while(s[j] >= '0' && s[j] <= '9') j ++ ; j -- ; for(; i <= j; i ++ ) { tmp = tmp * 10 + (s[i] - '0'); } q[++ tt] = tmp; tmp = 0, i = j; }
🌈 5.2 逗号情况
🌈 5.3 (坑点)负数的情况
else if(s[i] == '-' && s[i + 1] >= '0' && s[i + 1] <= '9') { int j = i + 1; i ++ ; while(s[j] >= '1' && s[j] <= '9') j ++ ; j -- ; for(; i <= j; i ++ ) { tmp = tmp * 10 + (s[i] - '0'); } q[++ tt] = tmp * -1; tmp = 0, i = j; }
🌈 5.4 其他运算符的情况
记得整个原则: 先弹出的元素在右边,后弹出来的在左
else { LL num1 = q[tt -- ]; LL num2 = q[tt -- ]; if(s[i] == '+') q[++ tt] = num1 + num2; else if(s[i] == '-') q[++ tt] = num2 - num1; else if(s[i] == '*') q[++ tt] = num2 * num1; else if(s[i] == '/') q[++ tt] = num2 / num1; }
完整代码
#include <iostream> #include <cstring> #include <stack> using namespace std; typedef long long LL; int n; string s; LL q[25010]; int hh = 0, tt = -1; int main() { cin >> n; LL tmp = 0; cin >> s; for(int i = 0; i < n; i ++ ) { if(s[i] >= '0' && s[i] <= '9') { int j = i + 1; while(s[j] >= '0' && s[j] <= '9') j ++ ; j -- ; for(; i <= j; i ++ ) { tmp = tmp * 10 + (s[i] - '0'); } q[++ tt] = tmp; tmp = 0, i = j; } else if(s[i] == ',') continue; else if(s[i] == '-' && s[i + 1] >= '0' && s[i + 1] <= '9') { int j = i + 1; i ++ ; while(s[j] >= '1' && s[j] <= '9') j ++ ; j -- ; for(; i <= j; i ++ ) { tmp = tmp * 10 + (s[i] - '0'); } q[++ tt] = tmp * -1; tmp = 0, i = j; } else { LL num1 = q[tt -- ]; LL num2 = q[tt -- ]; if(s[i] == '+') q[++ tt] = num1 + num2; else if(s[i] == '-') q[++ tt] = num2 - num1; else if(s[i] == '*') q[++ tt] = num2 * num1; else if(s[i] == '/') q[++ tt] = num2 / num1; } } cout << q[tt] << endl; return 0; }