📜  门| GATE-CS-2014-(Set-1) |问题 19(1)

📅  最后修改于: 2023-12-03 15:42:17.151000             🧑  作者: Mango

题目介绍

这是一道关于栈和队列的算法问题,出现在2014年的计算机科学GATE考试中。

在这道题目中,需要我们实现一个数据结构,满足以下要求:

  • 可以在O(1)的时间内进行操作;
  • 支持插入和删除操作;
  • 支持查询操作,可以在常数时间内返回栈或队列中的最小值。

实现思路

为了实现上述的要求,我们需要选择合适的数据结构。

对于插入和删除操作,我们可以选择使用栈或队列来实现。

对于查询操作,我们需要确定一个最小值,并且能够在常数时间内得到这个最小值。这个最小值可以按照以下思路得到:

  • 对于栈中的元素,我们可以用另一个栈来保存最小值。在每次入栈时,将当前栈中的最小值与新元素进行比较,如果新元素更小,则将新元素入栈;否则将原最小值再次入栈。在出栈操作时,同时从最小值栈中弹出对应的元素。
  • 对于队列中的元素,我们可以使用一个双向队列来保存最小值。在每次入队时,将当前队列中的最小值与新元素进行比较,如果新元素更小,则将新元素入队;否则将原最小值再次入队。在出队操作时,同时从最小值队列中弹出对应的元素。

代码实现

栈的实现
class StackWithMin:
    def __init__(self):
        self.stack = []
        self.min_stack = []

    def push(self, val):
        self.stack.append(val)
        if not self.min_stack or val <= self.min_stack[-1]:
            self.min_stack.append(val)

    def pop(self):
        if not self.min_stack or self.stack[-1] != self.min_stack[-1]:
            return self.stack.pop()
        else:
            self.min_stack.pop()
            return self.stack.pop()

    def get_min(self):
        return self.min_stack[-1]
队列的实现
from collections import deque

class QueueWithMin:
    def __init__(self):
        self.queue = deque()
        self.min_queue = deque()

    def push(self, val):
        self.queue.append(val)
        while self.min_queue and val < self.min_queue[-1]:
            self.min_queue.pop()
        self.min_queue.append(val)

    def pop(self):
        if self.queue[0] == self.min_queue[0]:
            self.min_queue.popleft()
        return self.queue.popleft()

    def get_min(self):
        return self.min_queue[0]

以上就是本题的详细介绍和代码实现。本题考察了对于栈、队列数据结构的理解,并考察了优化算法的能力。