返回
剑指offer初级算法题:两个栈实现队列和包含min函数的栈
前端
2023-12-22 11:20:23
用两个栈实现队列
队列是一种先进先出的数据结构,意味着第一个进入队列的元素也是第一个离开队列的元素。通常使用数组或链表来实现队列,但也可以用两个栈来实现。
用两个栈实现队列的原理是,一个栈用于存储新元素,另一个栈用于存储旧元素。当需要从队列中取出元素时,将旧元素栈中的元素弹出并压入新元素栈中,然后从新元素栈中弹出元素。这样,新元素始终位于新元素栈的栈顶,旧元素始终位于旧元素栈的栈底,从而实现了队列的先进先出特性。
代码示例:
class Queue:
def __init__(self):
self.s1 = []
self.s2 = []
def enqueue(self, x):
self.s1.append(x)
def dequeue(self):
if not self.s2:
while self.s1:
self.s2.append(self.s1.pop())
return self.s2.pop()
def is_empty(self):
return not self.s1 and not self.s2
包含min函数的栈
栈是一种后进先出的数据结构,意味着最后一个进入栈的元素也是第一个离开栈的元素。通常使用数组或链表来实现栈,但也可以创建一个包含最小值信息的栈。
包含最小值信息的栈的原理是,在栈中存储每个元素及其最小值。当需要从栈中弹出元素时,将栈顶元素及其最小值弹出,然后将栈中剩余元素的最小值压入栈中。这样,栈中始终包含最小值信息,可以通过查询栈顶元素来获取栈中最小值。
代码示例:
class Stack:
def __init__(self):
self.s = []
self.min_s = []
def push(self, x):
self.s.append(x)
if not self.min_s or x <= self.min_s[-1]:
self.min_s.append(x)
def pop(self):
if self.s[-1] == self.min_s[-1]:
self.min_s.pop()
return self.s.pop()
def top(self):
return self.s[-1]
def get_min(self):
return self.min_s[-1]
def is_empty(self):
return not self.s
结论
用两个栈实现队列和包含min函数的栈是计算机科学中非常有用的算法,可以解决各种各样的问题。这些算法的实现相对简单,但效率很高。
常见问题解答
-
为什么要用两个栈来实现队列?
- 使用两个栈可以实现先进先出的特性,而使用一个栈只能实现后进先出的特性。
-
包含min函数的栈有什么好处?
- 包含min函数的栈可以快速获取栈中的最小值,而普通栈只能通过遍历栈中的所有元素才能获取最小值。
-
如何判断包含min函数的栈是否为空?
- 判断包含min函数的栈是否为空的方法与判断普通栈是否为空的方法相同,即检查栈中是否还有元素。
-
如何从包含min函数的栈中删除最小值?
- 从包含min函数的栈中删除最小值需要先找到最小值,然后将其从栈中删除。
-
用两个栈实现队列和包含min函数的栈有什么区别?
- 用两个栈实现队列是实现先进先出的数据结构,而包含min函数的栈是实现后进先出的数据结构,并提供获取栈中最小值的功能。