@Sheephard

В чём ошибка реализации очереди с минимумом?

Есть задача:
Очередь с поддержкой минимума
Реализуйте очередь с поддержкой минимума.

Входные данные

Первая строка входных данных содержит число n — количество операций с очередью. В каждой следующей строке содержится число a (0≤a≤10000). Если a>0, то это число необходимо добавить в очередь. Если a=0, то это запрос на удаление элемента из очереди.

Выходные данные

На каждый запрос удаления элемента из очереди необходимо вывести значение минимального элемента очереди (учитывая значение удаляемого элемента). Если запрос удаления вызывается на пустой очереди, то необходимо вывести −1.


Есть следующая реализация очереди с минимумом через два стека.
class Stack_min:

    def __init__(self):
        self.stack = []
        self.stack_min = []

    def push(self, e):
        self.stack.append(e)
        if self.stack_min and self.stack_min[-1] < e:
            self.stack_min.append(self.stack_min[-1])
        else:
            self.stack_min.append(e)
        return self

    def pop(self):
        if self.stack != []:
            self.stack_min.pop()
            return self.stack.pop()

    def min(self):
        if self.stack_min:
            return self.stack_min[-1]

    def aslist(self):
        return self.stack

    def back(self):
        if self.stack != []:
            return self.stack[-1]

    def size(self):
        return len(self.stack)

    def clear(self):
        self.stack.clear()
        self.stack_min.clear()
        return self


class Queue_min:

    def __init__(self):
        self.s1 = Stack_min()
        self.s2 = Stack_min()

    def _copy(self):
        if self.s2.size() == 0:
            while self.s1.size():
                self.s2.push(self.s1.pop())

    def push(self, e):
        self.s1.push(e)
        return self

    def pop(self):
        self._copy()
        return self.s2.pop()

    def front(self):
        self._copy()
        return self.s2.back()

    def size(self):
        return self.s1.size() + self.s2.size()

    def min(self):
        self._copy()
        return self.s2.min()

    def clear(self):
        self.s1.clear()
        self.s2.clear()
        return self


queue = Queue_min()

for i in range(int(input())):
    inp = int(input())
    if inp != 0:
        queue.push(inp)
    else:
        if not queue.size():
            print(-1)
        else:
            print(queue.min())
            queue.pop()


При сдаче задачи система возвращает ошибку "Программа выдаёт неверный ответ". В чём может быть проблема?
  • Вопрос задан
  • 1007 просмотров
Решения вопроса 1
@TwoBlueCats
При вычислении минимума вы рассматриваете только один из двух стеков, а минимум может быть в любом из двух. Рассмотрим такой тест c 7 запросами:
7
5
6
7
0
1
2
0

После первой операции запроса минимума у вас в s2 будет лежать два элемента. Потом вы добавляете 2 меньших по значению элемента в s1. Во время второго запроса минимума не будет выполняться перенос элементов из s1 в s2 и вернется минимум только среди элементов s2.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы