目 录
1. 栈的应用场景
1.1 实际应用场景
总的来说,栈的运用还是非常广泛的,在实际的编程场景中,支持文本编辑器、字处理程序、电子表格程序、绘图程序或类似的应用程序中的撤销功能,支持维护 Web 浏览器所访问过的连接的历史记录。
1.2 例题分类
常见的例题有下面四种,会依次进行讲解,本章只讲表达式求值。
括号匹配:请看数据结构 03-栈的应用:括号匹配的代码实现_江南野栀子的博客-CSDN博客
数制转换:请看数据结构 03-栈的应用:数制转换的代码实现_江南野栀子的博客-CSDN博客
迷宫求解:请看数据结构 04-栈的应用:迷宫求解的代码实现_江南野栀子的博客-CSDN博客
表达式求值
2. 应用场景:表达式求值
逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后)。
2.1 迷宫求解例题
例题参看: 150. 逆波兰表达式求值 - 力扣(LeetCode) (leetcode-cn.com)
例题内容:
根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
注意 两个整数之间的除法只保留整数部分。
可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
2.2 表达式求值代码实现
def evalRPN(tokens):
stack=[]
res=0
for token in tokens:
if(token in ["+","-","*","/"]):
num1=int(stack.pop())
num2=int(stack.pop())
new_num=None
if(token == "+"):
new_num=num2+num1
elif(token == "-"):
new_num=num2-num1
elif(token == "*"):
new_num=num2*num1
elif(token == "/"):
new_num=int(num2/num1)
else:
return(None)
stack.append(new_num)
elif(token.startswith("-")):
stack.append((0-int(token[1:])))
elif(token.isnumeric()):
stack.append(token)
else:
return("NULL {0}".format(token))
return(int(stack.pop()))