📜  设计一个队列数据结构以在O(1)时间中获得最小值或最大值(1)

📅  最后修改于: 2023-12-03 14:57:39.922000             🧑  作者: Mango

设计一个队列数据结构以在O(1)时间中获得最小值或最大值

队列(Queue)是一种基本的数据结构,它遵循先进先出(FIFO)的原则,即先放入队列的数据将被先取出。队列可以用数组或链表实现。

本题要求我们设计一个队列数据结构,以在O(1)的时间复杂度内获得队列中的最小值或最大值。

解题思路

为了能够在O(1)时间获得队列中的最小值或最大值,我们可以利用辅助栈(Auxiliary Stack)。

具体实现方法如下:

  1. 创建两个栈(Stack1和Stack2),Stack1作为队列的主要存储结构,Stack2用于存储最小值或最大值。
  2. 入队操作:将元素push进Stack1,同时比较元素与Stack2栈顶元素的大小,如果元素更小或更大,则push进Stack2。
  3. 出队操作:将Stack1的栈顶元素pop出,并与Stack2的栈顶元素比较,如果相等,则同时将Stack2的栈顶元素pop出。
  4. 获取最小值或最大值:直接返回Stack2的栈顶元素即可。
代码示例
class QueueWithMin(object):
    def __init__(self):
        self.stack1 = []
        self.stack2 = []

    def push(self, value):
        self.stack1.append(value)
        if not self.stack2 or value <= self.stack2[-1]:
            self.stack2.append(value)

    def pop(self):
        if not self.stack1:
            return None
        value = self.stack1.pop(0)
        if self.stack2 and value == self.stack2[0]:
            self.stack2.pop(0)
        return value

    def min(self):
        if not self.stack2:
            return None
        return self.stack2[-1]

    def max(self):
        if not self.stack2:
            return None
        return self.stack2[-1]
总结

本题利用了辅助栈的思想,实现了在O(1)时间内获取最小值或最大值的功能。需要注意的是,由于Stack2只存储最小值或最大值,因此其长度不一定和Stack1相等。