【问题标题】:Creating a FIFO queue in C在 C 中创建一个 FIFO 队列
【发布时间】:2010-10-04 14:12:21
【问题描述】:

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

谢谢!

(对不起那些回答前一个问题的人。我在想LIFO,意思是FIFO。)

【问题讨论】:

    标签: c stack queue


    【解决方案1】:

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

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

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

    【讨论】:

    • 我不知道你为什么说你需要一个双向链表。为什么不只保留两个指针,一个指向头部,一个指向尾部?
    • 感谢您的回复!我在 K&R 还没有那么远,所以对我来说(还)不容易。
    • 如果删除头部的元素,则不需要双链接或存储两个以上的指针。因为头部指向下一个元素。
    • 首先,它是一个队列,而不是堆栈 :-)。如果您知道最大大小,您也不需要任何类型的链表。只需使用一个指针数组,这样效率会更高。队列从不从中间插入或删除。
    • @Pax - 但是如果您使用的是数组,您是否不需要在插入或删除时对数组元素进行洗牌?
    【解决方案2】:

    为此使用 2 个堆栈是一个有趣的解决方案,而且是一个缓慢的解决方案。当您可以使用普通队列时,为什么要提到堆栈?这是你想要的先进先出,对吧?您可以使用数组来创建队列,并对其长度进行取模以使其成为循环。

    【讨论】:

    • 这是一个有趣的解决方案,通常是在算法课上问的。
    • 用笔和纸需要几分钟,是的 ;-)
    【解决方案3】:

    听起来您正在尝试创建一个队列,在其中插入一端并从另一端拉出。

    一种方法是使用链表。您可以存储指向头部和尾部的指针。当你插入时,将新记录附加到尾部,当你从队列中弹出一些东西时,你抓住头指针指向的节点。 (反之亦然,没关系)

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 缺点是堆栈溢出的可能性。它对排队的最大项目数施加了限制。
        • 是的,我认为对于家庭作业问题,他/她可能会得到最大尺寸。
        【解决方案6】:

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

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

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

        【讨论】:

        • 我现在正在研究 K&R,但我还没有读到关于结构的章节。只剩下三页了!
        【解决方案7】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2013-11-15
          • 1970-01-01
          • 2017-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-16
          • 1970-01-01
          相关资源
          最近更新 更多