Реализовать стек ограниченного размера на Python

Помогите решить эту задачу: Реши задачу на Python: В этой задаче вам нужно реализовать стек ограниченного размера. Этот стек работает как обычный стек, однако при превышении максимального размера удаляет самый глубокий элемент в стеке. Таким образом в стеке всегда будет ограниченное число элементов.

Операция Push должна иметь сложность O(1), то есть никак не зависеть от размера стека.

Описание входных данных

В первой строке подаётся целое число, ограничитель размера стека. В следующих строках указаны команды для работы со стеком:

push n Добавить в очередь число n (значение n задается после команды). Программа должна вывести «ok». pop Удалить из очереди первый элемент. Программа должна вывести его значение. count Программа должна вывести количество элементов в очереди. exit Программа должна вывести «bye» и завершить работу. Описание выходных данных Требуется вывести протокол работы со стеком, по одному сообщению на строке.

Формат ввода 2\n push 10\n push 20\n push 30\n push 40\n pop\n pop\n count\n exit\n

Формат вывода ok\n ok\n ok\n ok\n 40\n 30\n 0\n bye

Примечания Обратите внимание, что в этой задачи ввод и вывод реализован только через файлы input.txt и output.txt Задача не проходит все тесты при таком коде

class LimitedSizeStack:
    def __init__(self, max_size):
        self.stack = []
        self.max_size = max_size

    def push(self, value):
        if len(self.stack) < self.max_size:
            self.stack.append(value)
        else:
            self.stack.pop(0)
            self.stack.append(value)
        return 'ok'

    def pop(self):
        if self.stack:
            return self.stack.pop()
        else:
            return 'error'

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


def main():
    with open("input.txt", "r") as f:
        max_size = int(f.readline().strip())
        commands = f.readlines()

    stack = LimitedSizeStack(max_size)
    output = []

    for command in commands:
        command = command.strip().split()
        if command[0] == "push":
            output.append(stack.push(int(command[1])))
        elif command[0] == "pop":
            output.append(stack.pop())
        elif command[0] == "count":
            output.append(stack.count())
        elif command[0] == "exit":
            output.append('bye')
            break

    with open("output.txt", "w") as f:
        for line in output:
            f.write(f"{line}\n")


if __name__ == "__main__":
    main()

Ответы (1 шт):

Автор решения: CrazyElf

Если я правильно помню, тут кольцевой буфер подойдёт, тогда добавление/удаление будет O(1).

  • При инициализации сделать список фиксированного размера
  • Сделать указатели на начало и конец стека
  • При добавлении элемента сдвигать указатель конца вправо (положив туда новый элемент)
  • При удалении элемента сдвигать указатель начала вправо (но сначала выдать элемент, на который он указывает)
  • Контролировать переход через границы буфера и "заворачивать" указатели на начало при необходимости
  • Размер стека тоже считать учитывая возможный переход через границу кольцевого буфера (в случае если указатель конца < указателя начала)
→ Ссылка