在C语言中创建FIFO队列

在C语言中创建FIFO队列,c,stack,queue,C,Stack,Queue,是否可以在不使用2个堆栈的情况下在C中创建FIFO“堆栈” 谢谢 (对不起那些回答上一个问题的人。我想的是后进先出,意思是先进先出。)这很简单。 只需实现一个双链接列表,将指针指向列表中的最后一项 要添加到队列,请在开始处创建一个新节点,将其链接到上一个开始处。(正常列表插入) 要从队列中删除,请取消引用指向最后一项的指针,更改指向上一项指针的指针,然后返回最后一项。。。(这就是为什么要使用双链接列表。另一个选项是单链接列表并迭代整个列表以获得指向最后两个元素的指针)。使用两个堆栈是一个有趣的解

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

谢谢

(对不起那些回答上一个问题的人。我想的是后进先出,意思是先进先出。)

这很简单。 只需实现一个双链接列表,将指针指向列表中的最后一项

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


要从队列中删除,请取消引用指向最后一项的指针,更改指向上一项指针的指针,然后返回最后一项。。。(这就是为什么要使用双链接列表。另一个选项是单链接列表并迭代整个列表以获得指向最后两个元素的指针)。

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

听起来您好像在尝试创建队列,在队列的一端插入,从另一端拉出


一种方法是使用链表。您可以存储指向头部和尾部的指针。插入时,将新记录附加到尾部;从队列中弹出某个内容时,抓取头指针指向的节点。(或者相反,这没什么大不了的)

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

你也可以实现带有尾部指针的队列。

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

传入的项目被推到stack1上,当stack2为空时,所有项目都弹出到stack2上。因此,第一个项目被推到stack1上,第一个项目立即弹出并推到stack2上,准备输出。后续项目在stack1上堆叠,直到stack2弹出,此时最后一个项目进入stack2,然后是倒数第二个项目,依此类推,直到stack1再次为空。现在所有的物品都重新打包在stack2上,最新的在底部,最旧的在顶部。新的推送继续在stack1上建立,等待stack2再次变为空,stack2只按原始顺序生成项目,直到其为空,此时我们重复取消堆栈重新打包过程


我不会评论效率等问题。;只是“你可以那样做”。我在一次采访中被问到这个问题,我的直接回答是“什么样的白痴会这样做?只需实现一个实际的队列并完成它”——我不认为这是他们想要的答案。

虽然已经提出了正确的解决方案,但我只想纠正FIFO不是真正的堆栈

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


FIFO可以使用双链表、带有开始和结束指针的数组/向量、带有循环数组等来构建。

我不知道你为什么说需要双链表。为什么不保留两个指针,一个指向头部,一个指向尾部?谢谢你的回复!我在K&R方面还不算太远,所以对我来说还不容易。如果删除头部的元素,就不需要双链接或存储两个以上的指针。因为头指向下一个元素。首先,它是一个队列,而不是堆栈:-)。如果知道最大大小,也不需要任何类型的链接列表。只需使用一个指针数组,这样会更有效。队列从不从中间插入或删除。@Pax-但是如果您使用的是数组,您不需要在插入或删除时洗牌数组元素吗?我现在正在研究K&R,我还没有读到关于结构的章节。只剩下三页了!缺点是可能出现堆栈溢出。它对排队的项目的最大数量施加了限制。是的,没错,我认为对于一个家庭作业问题,他/她可能会得到一个最大尺寸。这是一个有趣的解决方案,通常是在算法课上提出的问题。用笔和纸需要几分钟,是的;-)