📅  最后修改于: 2023-12-03 15:11:42.425000             🧑  作者: Mango
在编程中,经常会遇到需要按照某种顺序存储和访问数据的情况。其中一种较为常见的方法就是 LIFO,即后进先出(Last-In-First-Out)。下面我们将会介绍 LIFO 的具体实现和使用场景。
在数据结构方面,LIFO 通常使用栈(Stack)来实现。栈是一种只允许在某一端进行插入和删除操作的线性数据结构,这一端被称为栈顶。栈的插入操作被称为入栈(Push),删除操作被称为出栈(Pop)。当进行出栈操作时,返回的元素为最后一个被入栈的元素。因此,后进先出。
在 Python 中,可以使用列表或 deque 类(Python 标准库中的双端队列)来实现栈。
Markdown 代码片段:
# 使用列表实现栈
stack = []
stack.append(1) # 入栈
stack.append(2)
top_element = stack.pop() # 出栈,返回 2
# 使用 deque 类实现栈
from collections import deque
stack = deque()
stack.append(1) # 入栈
stack.append(2)
top_element = stack.pop() # 出栈,返回 2
下面我们来看一些 LIFO 在编程中的常见使用场景:
在程序执行过程中,每一次函数调用都需要新建一个对应的函数栈帧(栈帧是指存储函数的局部变量、参数和返回地址等信息的内存结构体),并将其入栈。当函数返回时,该栈帧出栈并被销毁。因此,函数调用栈就是一个典型的栈结构,实现了函数调用的 LIFO 特性。
Markdown 代码片段:
def func1():
print("enter func1")
func2()
print("exit func1")
def func2():
print("enter func2")
print("exit func2")
func1()
在编辑器中,我们可以使用撤销操作(Undo)来回退之前的编辑内容。撤销操作实现了 LIFO 特性,即每一次编辑操作都相当于入栈,每一次执行撤销操作则相当于出栈。
Markdown 代码片段:
class Editor:
def __init__(self):
self.content = ""
self.history = deque()
def edit(self, text):
self.history.append(self.content) # 入栈之前的编辑内容
self.content += text
def undo(self):
self.content = self.history.pop() # 出栈最后一次编辑内容
editor = Editor()
editor.edit("hello")
editor.edit("world")
print(editor.content) # hello world
editor.undo()
print(editor.content) # hello
editor.undo()
print(editor.content) # 空字符串
在表达式求值中,我们通常需要通过栈来实现运算符的优先级和操作数的处理。例如,在中缀表达式转后缀表达式时,可以使用一个栈来存储运算符。遇到一个运算符时,将其与栈顶运算符比较,如果栈顶运算符优先级更高,则将其弹出并加入后缀表达式中,然后继续比较。如果栈顶运算符优先级更低或相等,则将其入栈。
Markdown 代码片段:
# 中缀表达式转后缀表达式
def infix_to_postfix(infix_expression):
precedence = {"+": 1, "-": 1, "*": 2, "/": 2, "^": 3}
postfix_expression = ""
operator_stack = deque()
for token in infix_expression.split():
if token.isdigit():
postfix_expression += token + " "
elif token in precedence:
while operator_stack and precedence[token] <= precedence.get(operator_stack[-1], 0):
postfix_expression += operator_stack.pop() + " "
operator_stack.append(token)
elif token == "(":
operator_stack.append(token)
elif token == ")":
while operator_stack and operator_stack[-1] != "(":
postfix_expression += operator_stack.pop() + " "
operator_stack.pop() # 弹出左括号
while operator_stack:
postfix_expression += operator_stack.pop() + " "
return postfix_expression.strip()
print(infix_to_postfix("3 + 4 * 2 / (1 - 5) ^ 2"))
# 输出:3 4 2 * 1 5 - 2 ^ / +
LIFO 是一种常见的存储和访问数据的方式,常用于函数调用栈、撤销操作、表达式求值等场景。在 Python 中,可以使用列表或 deque 类来实现栈。希望本文能够对程序员朋友们有所帮助。