Решите проблему с здачей очередь с защитой от ошибок
я писал подобное обращение, но я в заблуждении, так как с стеком и деком решил, а тут ничего не помогает
Очередь с защитой от ошибок Реализуйте структуру данных "очередь". Напишите программу, содержащую описание очереди и моделирующую работу очереди, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:
push n — добавить в очередь число n (значение n задаётся после команды). Программа должна вывести ok;
pop — удалить из очереди первый элемент. Программа должна вывести его значение;
front — программа должна вывести значение первого элемента, не удаляя его из очереди;
size — программа должна вывести количество элементов в очереди;
clear — программа должна очистить очередь и вывести ok;
exit — программа должна вывести bye и завершить работу.
Перед исполнением операций front и pop программа должна проверять, содержится ли в очереди хотя бы один элемент. Если во входных данных встречается операция front или pop и при этом очередь пуста, то программа должна вместо числового значения вывести строку error.
ввод:
push 1
front
exit
вывод:
ok
1
bye
вот код
def push(a,n):
a.append(n)
print('ok')
def pop(a):
if len(a)>0:
print(a.pop([0]))
else:
print('error')
def front(a):
if len(a)>0:
print(a[0])
else:
print('error')
def size(a):
print(len(a))
def clear(a):
a.clear()
print('ok')
a=[]
word=list(iter(input, 'exit'))
for i in word:
if 'size' in i:
size(a)
elif 'pop' in i:
pop(a)
elif 'front' in i:
front(a)
elif 'clear' in i:
clear(a)
else:
push(a,i.split()[-1])
print('bye')
конкретно не проходит тесты , прошу помощи
Ответы (2 шт):
У тебя по времени не проходит или ответы неверные? Ты подумал про то, что все операции для очереди должны быть за О(1)? Твое >a.pop([0])< будет работать за О(n). Предлагаю вариант: смещать индекс первого элемента очереди, не производя других операций. Также не забудь подумать про лишнее место в массиве, которое будет забито уже "удаленными" элементами. Другие команды также придется немного изменить, но это будет быстрее.
Идея такая же, как у ответа выше. В тестирующей системе Сириуса проходит все тесты.
command = 0
index_first = 0
queue = []
while command != 'exit':
command = input()
if 'push' in command:
if len(queue) - index_first <= index_first:
queue = queue[index_first:]
index_first = 0
queue.append(int(command.split()[-1]))
print('ok')
elif command == 'pop':
if len(queue) - index_first > 0:
print(queue[index_first])
index_first += 1
else:
print('error')
elif command == 'front':
print(queue[index_first]) if len(queue) - index_first > 0 else print('error')
elif command == 'size':
print(len(queue) - index_first)
elif command == 'clear':
queue = []
index_first = 0
print('ok')
elif command == 'exit':
print('bye')