Очереди и стеки являются абстрактными структурами данных, которые имеют четко определенное поведение, и любая реализация этих структур данных должна уважать этот контракт.
Ваша идея использовать один массив для реализации двух стеков хороша.Но вставки и удаления должны происходить в обоих стеках.
Например,Допустим, у вас есть эта настройка
2 3 4 5 6
top (stack1) равен 2
bottom (stack1) равен 4
top (stack2) равен 6
bottom (stack2) равен 5
после выхода из stack1 3 раза вы достигли дна своего стека, т.е. 4
и больше не могли бы ничего вытолкнуть, даже если есть еще дваэлементы в вашей QUEUE
реализации.Итак, необходимо внести некоторые исправления в вашу реализацию.
Итак, если бы я реализовал два стека, эмулирующих QUEUE, я бы так и сделал.
Stack1 : 2 3 4 5 6
, который по сути является массивом
2
- это нижняя часть стека, а 6
- верхняя часть стека.
Stack2 : empty
Вставить элемент в очередь:
Это очень просто.Просто добавьте в конец массива, например, stack1
stack1 : 2 3 4 5 6 7
Теперь 7
является вершиной стека.
Удалить элемент изОчередь:
1. Вставьте все элементы в stack1 и вставьте их в stack2.Таким образом, ваш массив будет инвертирован
stack1 : empty
stack2 : 7 6 5 4 3 2
.Теперь 2
находится на вершине стека.
2. Теперь ваша вершина (stack2) будет указывать на 2
.Просто вставьте это.7 6 5 4 3
3. Теперь для оставшихся элементов в stack2 извлеките их из stack2 и вставьте их в stack1.
stack2 : empty
stack1 :3 4 5 6 7
PS: Приведенный выше алгоритм предполагает, что вы знаете, как управлять памятью для массивов по мере ее сжатия или расширения.