Создание очереди FIFO в C

можно ли создать "стек" FIFO в C без использования 2 стеков?

спасибо!

(жаль тех, кто ответил на предыдущий. Я думал о ЛИФО и имел в виду ФИФО.)

7 ответов


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

чтобы добавить в очередь, создайте новый узел в начале, связав его с предыдущим началом. (обычный список вставить)

чтобы удалить из очереди, deref указатель на последний элемент, измените указатель на указатель предыдущего элемента и верните последний элемент... (Вот почему список с двойной связью. Другой вариант-это односвязный список и итерация весь список, чтобы получить указатели на два элемента).


похоже, вы пытаетесь сделать очередь, где вы вставляете с одного конца и тянете с другого.

один из способов сделать это с помощью связанного списка. Вы можете хранить указатели на голову и хвост. Когда вы вставляете, добавляете новую запись в хвост, а когда вы что-то вытаскиваете из очереди, вы хватаете узел, на который указывает указатель head. (Или наоборот, это не имеет большого значения)


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


использование 2 стеков для этого-забавное решение,и медленное. Почему вы упоминаете stack, когда вы можете использовать обычную очередь? Ты ведь хочешь ФИФО, верно? Вы могли бы использовать массив, чтобы сделать очереди, moduloing его длину, чтобы сделать ее круговой.


вы также можете реализовать очередь с круговой массив.


хотя правильные решения уже предложены, я просто хотел бы исправить, что FIFO на самом деле не стек.

этот вопрос часто встречается в классе алгоритмов, где они просят вас построить его с помощью стеков и доказать, что амортизированная стоимость вставки и удаления равна O(1).

FIFOs может быть построен с использованием двусвязного списка, массива / вектора с указателем начала и конца, с круговыми массивами и т. д...


Я думаю, что ОП хотел знать, как справиться с этим, если все, что у него есть, это стеки, по какой-то тайной причине. Хитрость в том, чтобы помнить, что толкая вещи в стопку, а затем выскакивая ее, меняет порядок элементов, так что вы можете использовать две стопки, чтобы изменить его дважды.

входящие элементы нажимаются на stack1, и все выскочили на stack2, когда stack2 пуст. Таким образом, первый элемент нажимается на stack1, немедленно выскакивает и нажимается на stack2, готовый к выходу. Последующие элементы складываются на stack1 до тех пор, пока stack2 не выскочит, в этот момент последний элемент переходит на stack2, затем следующий к последнему, и так далее, пока stack1 снова пуст. Теперь все предметы упакованы на stack2, с самым новым внизу и самым старым вверху. Новые толчки продолжают накапливаться на stack1, ожидая, что stack2 снова станет пустым, а stack2 просто производит элементы в исходном порядке, пока он не опустеет, и в этот момент мы повторяем unstack-restack процесс.

Я не буду комментировать эффективность и т. д.; это просто "вы могли бы сделать это таким образом". Меня спросили об этом в интервью, и мой немедленный ответ был "какой идиот do что? Просто реализуйте фактическую очередь и покончите с ней" - я не думаю, что это был ответ, который они искали.