在C中创建FIFO队列

时间:2009-01-30 22:16:44

标签: c stack queue

是否可以在不使用2个堆栈的情况下在C中创建FIFO'堆栈'?

谢谢!

(对不起那些回复上一篇文章的人。我在想LIFO并意味着FIFO。)

7 个答案:

答案 0 :(得分:4)

这很容易。 只需实现一个双向链表,按住指向列表中最后一项的指针。

要添加到队列,请在开头创建一个新节点,将其链接到上一个开头。 (正常列表插入)

要从队列中删除,请将指针deref指向最后一项,将指针更改为前一项指针,然后返回最后一项......(这就是双向链表的原因。另一种选择是单链表并迭代整个列表以获得指向最后两个元素的指针。)

答案 1 :(得分:2)

听起来你正在尝试排队,在一端插入并从另一端拉出。

一种方法是使用链表。您可以存储指向头部和尾部的指针。插入时,将新记录追加到尾部,当您从队列中弹出一些内容时,将获取头指针指向的节点。 (或者反之,它并不重要)

答案 2 :(得分:2)

这不是一个标准的链表,除了你只定义了拉出head元素并将东西推到tail元素上的函数吗?您甚至可以在带有尾指针的单链表中执行此操作,而不是完全双向链表。

答案 3 :(得分:1)

使用2个堆栈是一个有趣的解决方案,而且速度很慢。当你可以使用普通队列时,为什么要提到堆栈?它是你想要的FIFO,对吗?您可以使用数组来创建队列,对其长度进行模数化以使其成为圆形。

答案 4 :(得分:1)

您还可以使用circular array实现队列。

答案 5 :(得分:1)

虽然已经提出了正确的解决方案,但我只想纠正那个FIFO并非真正的堆栈。

这个问题经常出现在Algorithms类中,他们要求你使用堆栈构建一个问题,并证明插入和删除的摊销成本是O(1)。

可以使用双向链表建立FIFO,带有开始和结束指针的数组/向量,带圆形数组等等......

答案 6 :(得分:0)

我认为OP想要知道如何处理它,如果他所有的都是堆栈,无论出于何种神秘的原因。诀窍是记住将东西推入堆栈然后弹出它会反转项目的顺序,因此您可以使用两个堆栈将其反转两次。

传入的项目被推送到stack1,当stack2为空时,它们全部弹出到stack2上。因此第一个项目被推送到stack1,立即弹出并推入stack2,准备输出。后续项目在stack1上堆叠,直到stack2被弹出,此时最后一个项目在stack2上,然后是next-to-last,依此类推,直到stack1再次为空。现在所有的物品都在stack2上重新堆叠,最新的在底部,最旧的在顶部。新推送继续在stack1上构建,等待stack2再次变为空,stack2只生成原始顺序的项目,直到它为空,此时我们重复unstack-restack过程。

我不会评论效率等;它只是“你可以这样做”。我在接受采访时被问到这一点,我的直接回答是“什么样的白痴那么?只是实施一个实际的队列并完成它” - 我不认为这就是他们的答案正在寻找。

相关问题