返回
巧妙利用栈构造队列—— LeetCode 232
闲谈
2023-12-01 01:48:52
引言:队列与栈的基础知识
在介绍用栈实现队列之前,我们先来回顾一下队列和栈这两种基本数据结构。队列是一种遵循“先进先出”(FIFO)原则的数据结构,意味着最早进入队列的元素也将最先被移除。而栈则遵循“后进先出”(LIFO)原则,即最后进入栈的元素将最先被移除。
妙招:用两个栈模拟队列
虽然栈与队列的工作方式截然不同,但我们可以巧妙地利用两个栈来模拟队列的行为。具体步骤如下:
- 入队操作 :
当我们需要将元素推入队列时,我们将其推入第一个栈(称为栈 A)。 - 出队操作 :
当我们需要从队列中移除元素时,我们首先检查第二个栈(称为栈 B)是否为空。如果栈 B 不为空,则直接从栈 B 弹出元素。否则,我们将栈 A 中的所有元素依次弹出并推入栈 B,然后从栈 B 弹出元素。 - 查看队首元素操作 :
当我们需要查看队列的队首元素时,我们只需查看栈 B 的栈顶元素即可。 - 判断队列是否为空操作 :
当我们需要判断队列是否为空时,我们只需检查两个栈是否都为空即可。
代码示例:用 Python 实现队列
class MyQueue:
def __init__(self):
self.stack_in = [] # 入队栈
self.stack_out = [] # 出队栈
def push(self, x):
self.stack_in.append(x)
def pop(self):
if not self.stack_out:
while self.stack_in:
self.stack_out.append(self.stack_in.pop())
return self.stack_out.pop()
def peek(self):
if not self.stack_out:
while self.stack_in:
self.stack_out.append(self.stack_in.pop())
return self.stack_out[-1]
def empty(self):
return not self.stack_in and not self.stack_out
结语:掌握巧妙技巧,轻松解决问题
通过利用两个栈巧妙地模拟队列的行为,我们不仅可以解决 LeetCode 232 这道题目,更重要的是,我们掌握了一种灵活的技巧,可以在其他类似问题中灵活运用。希望本篇文章能够帮助您深入理解栈和队列的数据结构,并为您的编程之旅增添新的灵感。