Python中的stack函数的用法
栈(Stack)是一种数据结构,它具有Last-In-First-Out(后进先出)的特性。在Python中,可以使用stack函数来创建和操作栈。本文将介绍Python中stack函数的用法,涵盖以下几个方面:
1. stack函数的定义和用法
2. 栈的基本操作:入栈和出栈
3. 通过stack函数实现逆波兰表达式
4. 栈的应用:括号匹配问题
5. 应用案例:使用栈模拟浏览器的前进后退功能
1. stack函数的定义和用法
在Python中,可以使用list来模拟栈,但是这种方法效率较低。为了提高效率,Python提供了stack类,使用这个类可以更方便地创建和操作栈。
stack函数的基本语法如下:
```
from queue import LifoQueue
stack = LifoQueue(maxsize = 0)
```
其中,from queue import LifoQueue引入了Python内置的LifoQueue模块,LifoQueue是Python中的一个类,用于创建一个先进后出(Last-In-First-Out)的栈,具有stack的所有基本特性。maxsize参数指定了该栈的最大容量,如果不指定则默认为0,即不限制容量。
2. 栈的基本操作:入栈和出栈
栈的基本操作包括入栈(push)和出栈(pop)。在Python中,使用put方法进行入栈操作,使用get方法进行出栈操作,如下所示:
```
stack.put(1)
stack.put(2)
stack.put(3)
print(stack.get()) # 输出3
```
此时栈中的元素为[1, 2],因为最后入栈的元素是3,先出栈。
3. 通过stack函数实现逆波兰表达式
逆波兰式(Reverse Polish notation)又叫后缀表达式,它是一种数学表达式的书写和计算方法,与中缀表达式相比,逆波兰式可以避免使用括号,且可方便地实现加减乘除等基本计算操作。
在逆波兰表达式中,操作符在两个操作数的后面,如下所示:
```
3 4 +
```
这个表达式等价于普通表达式“3+4”,其计算过程如下:
1. 将操作符+和操作数3、4依次入栈
2. 遇到+操作符时,弹出栈顶的操作数4和3,计算3+4=7
3. 将7入栈,完成计算
为了实现这种运算,可以通过栈来辅助计算。代码示例如下:
```
def evalRPN(tokens):
stack = []
for token in tokens:
if token in ["+", "-", "*", "/"]:
b = stack.pop()
a = stack.pop()
if token == "+":
stack.append(a+b)
elif token == "-":
stack.append(a-b)
elif token == "*":
stack.append(a*b)
else:
stack.append(int(a/b))
else:
stack.append(int(token))
return stack.pop()
```
在这个函数中,我们首先创建一个空栈,然后对表达式中的每个字符进行遍历。如果是操作符,则出栈两个操作数进行计算,计算结果入栈;如果是操作数,则入栈。最终栈中只剩下一个元素,即为表达式的计算结果。
4. 栈的应用:括号匹配问题
栈也可以应用于括号匹配问题。例如,给定一个只包含字符'('和')'的字符串,编写一个函数来判断这个字符串是否是有效的括号字符串。
有效的括号字符串需要满足以下条件:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
代码示例如下:
```
def isValid(s):
stack = []
for i in s:
if i == "(":
stack.append(")")
elif i == "[":
stack.append("]")
elif i == "{":
stack.append("}")
elif not stack or stack.pop() != i:
return False
return not stack
```
在这个函数中,我们首先创建一个空栈,然后对字符串中的每个字符进行遍历。如果是左括号,则将对应的右括号入栈;如果是右括号,将其与栈顶元素进行比较,如果不匹配则返回False。遍历完字符串后,如果栈为空,说明该字符串是有效的括号字符串。
5. 应用案例:使用栈模拟浏览器的前进后退功能
栈可以应用于模拟浏览器的前进后退功能。例如,我们可以使用两个栈history和forward来实现这个功能。
- history栈用于存储用户的历史访问记录,每次访问URL时入栈。
- forward栈用于存储用户的前进记录,用户点击“前进”按钮时,从forward栈弹出栈顶元素,入栈history中。
- 如果用户点击“后退”按钮,则从history栈弹出栈顶元素,入栈forward中。
- 如果history栈为空,则不能点击“后退”按钮;如果forward栈为空,则不能点击“前进”按钮。
代码示例如下:
```
class Browser:
def __init__(self):
self.history = []
self.forward = []
def visit(self, url):
self.history.append(url)
self.forward.clear()
def back(self):
if len(self.history) > 1:
self.forward.append(self.history.pop())
return self.history[-1]
def forward(self):
if self.forward:
self.history.append(self.forward.pop())
return self.history[-1]
```
在这个类中,我们首先定义了两个空栈history和forward,然后定义了三个方法visit、back和forward,分别实现访问URL、后退和前进功能。
- visit方法将URL入栈history中,同时清空forward栈。
- back方法将history栈顶元素弹出,并入栈forward中,返回history栈顶元素;如果history栈长度为1,则不能执行该方法。
- forward方法将forward栈顶元素弹出,并入栈history中,返回history栈顶元素;如果forward栈为空,则不能执行该方法。
微信扫一扫,领取最新备考资料