返回

剑指offer初级算法题:两个栈实现队列和包含min函数的栈

前端

用两个栈实现队列

队列是一种先进先出的数据结构,意味着第一个进入队列的元素也是第一个离开队列的元素。通常使用数组或链表来实现队列,但也可以用两个栈来实现。

用两个栈实现队列的原理是,一个栈用于存储新元素,另一个栈用于存储旧元素。当需要从队列中取出元素时,将旧元素栈中的元素弹出并压入新元素栈中,然后从新元素栈中弹出元素。这样,新元素始终位于新元素栈的栈顶,旧元素始终位于旧元素栈的栈底,从而实现了队列的先进先出特性。

代码示例:

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函数的栈是计算机科学中非常有用的算法,可以解决各种各样的问题。这些算法的实现相对简单,但效率很高。

常见问题解答

  1. 为什么要用两个栈来实现队列?

    • 使用两个栈可以实现先进先出的特性,而使用一个栈只能实现后进先出的特性。
  2. 包含min函数的栈有什么好处?

    • 包含min函数的栈可以快速获取栈中的最小值,而普通栈只能通过遍历栈中的所有元素才能获取最小值。
  3. 如何判断包含min函数的栈是否为空?

    • 判断包含min函数的栈是否为空的方法与判断普通栈是否为空的方法相同,即检查栈中是否还有元素。
  4. 如何从包含min函数的栈中删除最小值?

    • 从包含min函数的栈中删除最小值需要先找到最小值,然后将其从栈中删除。
  5. 用两个栈实现队列和包含min函数的栈有什么区别?

    • 用两个栈实现队列是实现先进先出的数据结构,而包含min函数的栈是实现后进先出的数据结构,并提供获取栈中最小值的功能。