【问题标题】:Adding all values of 2 stacks to 1 stack and sorting them将 2 个堆栈的所有值添加到 1 个堆栈并对其进行排序
【发布时间】:2013-05-14 15:15:56
【问题描述】:

有 3 个堆栈 - A、B、C

堆栈 A 和 B 已排序(堆栈顶部的数字最大)。 堆栈 C 为空 只允许 5 次操作:

push
pop 
top 
is_empty
create

我们需要编写一个函数来接收栈 A 和 B,将栈 A 和 B 中的所有数字移动到栈 C 并且必须对栈 C 进行排序(最大的数字在顶部)。

【问题讨论】:

  • 堆栈 C 是未排序的还是空的?
  • 另外,你试过什么?好的Stack Overflow 问题应该表明自己尝试解决问题。
  • -1 表示没有表现出任何努力。
  • 创建操作应该做什么?

标签: algorithm sorting stack


【解决方案1】:

对于第一次切割,将问题分成两部分:

  • 将元素从 A 和 B 移到 C 中,最少的元素位于顶部。
  • 将顶部元素最少的 C 转换为顶部元素最高的 C,即颠倒排序顺序。

一旦你有了这个,你就可以看看是否有更好/更有效的算法。

【讨论】:

    【解决方案2】:

    查找towers of hanoi,一个标准问题/谜题。

    【讨论】:

    • 当然可以。实际上,难题正是您的程序应该建模的内容。提示:尝试将问题描述中的对象与代码实体匹配。如果你不成功,请按数字。
    • 我只需要知道如何移动它们.. 1.) 将它们全部移动到堆栈 C,然后对它们进行排序 2.) 从 A 的顶部弹出一个值,然后从 B 顶部的值,看看谁更大,然后将它们插入 C .. 哪个?
    • @WaseemGabour 河内塔问题正是你需要解决这个问题。如果一堆光盘与堆栈无关,那么什么都没有。如果你仍然无法想象问题的等价性,想象一下河内塔问题的修改,其中最大的圆盘堆叠在顶部,并且必须移动到第三个钉子(堆栈 C),最大的在顶部。
    • 谢谢 .. 但是任何人都可以为它写代码吗?不使用结构 .. 只需 5 次操作 ..
    • 这是一个限制较少的河内塔变体(并非每一步都需要排序,起始位置不同)。这可能足以让不同的方法更有效。
    【解决方案3】:

    在对堆栈进行排序时,您可以应用归并排序机制。我的想法类似于user1930928。但添加这个是为了更清晰和扩展数据反转。

    算法如下

    1. 比较 A 的顶部和 B 的顶部

    2. 弹出最少元素并压入栈C

    3. 重复第 2 步,直到任何堆栈(A 或 B)变为空

    4. 将剩余元素从非空堆栈移至 C。 现在您拥有 C 中的所有元素,但按升序排列。 (这是顶部的最少元素)。

    5. 将所有元素从C移到A。(A中的内容按降序排列)

    6. 将所有元素从A移动到B。(B中的内容按升序排列)

    7. 将所有元素从 B 移动到 C。

    现在C的内容是降序排列的,就是想要的结果。

    我鼓励您尝试编写程序。如果你愿意,我可以写。

    【讨论】:

    • While (!is_empty(a)) { if (top(a)>top(b)) push (c,pop(a)) else if (top(a)
    猜你喜欢
    • 2015-01-14
    • 2021-09-03
    • 2021-11-02
    • 2016-09-13
    • 2021-08-12
    • 2011-06-17
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多