【问题标题】:Stack question: pop out in a pattern堆栈问题:以模式弹出
【发布时间】:2010-12-13 20:07:31
【问题描述】:

在运行时我想输入两种数据类型,双精度和字符串。 条件之一是 String 应该按照我输入的顺序弹出,而 double 将按照通常的堆栈行为 LIFO 弹出。另一个条件是堆栈被限制为最大大小 10

例如一个运行时示例

输入 Hello 1 World 2 blah blah 3 4 5

输出 Hello 5 World 4 blah blah 3 2 1

我的第一个问题是有多少种方法可以解决这个问题? 我已经使用 3 个堆栈解决了这个问题,一个存储双精度,一个存储字符串,一个用于反转字符串顺序。

我需要保存模式以便程序知道双打的顺序,因此我将模式保存到字符串堆栈。由于堆栈的大小限制为 10,因此我需要以另一种方式保存模式。

这就是我的字符串堆栈在推送后的样子

  1. 你好*
  2. 世界*
  3. 废话
  4. 废话***

因此,在第一次读取时,我需要在堆栈位置进行特定读取,然后从中提取 Hello。当我告诉程序下一个 pop 是双精度时,星号 * 留待以后使用。

我的第二个问题是我想知道是否有其他更优雅的解决方案来解决这个问题。因为我的解决方案将涉及一些字符串操作来解决这个问题。至于现在,我实际上并没有在字符串大小写中使用 pop 函数,因为它应该被使用。顺便说一句,我用 C++ 制作了解决方案。

【问题讨论】:

  • 通常的堆栈行为,FIFO -- 不,堆栈是 LIFO,FIFO 被称为“队列”。
  • 您必须使用堆栈还是使用其他结构?
  • @imz: 是的,我会编辑它
  • @casablanca:是的,我必须使用堆栈
  • 不可能有一个通用的解决方案。当堆栈有 10 个条目,你需要输出一个数字,但最后一个数字还没有到达时,你会怎么做?

标签: algorithm string stack double


【解决方案1】:

你所做的很好,除了如果你必须使用堆栈,那么你就不能访问堆栈中的随机位置——你只能推/弹出——而且修改输入字符串并在其中存储星号也不是很好。

您可以使用 only 使用 5 个堆栈的 push/pop 操作来解决此问题(从技术上讲,任何时候只会使用 4 个,但由于它们属于不同的类型,因此您需要声明所有 5 个在你的程序中):

堆栈 1:按输入顺序推送双精度数

堆栈2:按输入顺序推送字符串

堆栈 3:按输入顺序推送数据类型(双精度或字符串)

堆栈 4:反转堆栈 2 中字符串的顺序

堆栈5:反转堆栈3中数据类型的顺序

现在从堆栈 5 中一次弹出一种数据类型,如果是双精度类型,则从堆栈 1 中弹出,否则从堆栈 5 中弹出,并打印弹出的值。

编辑: @jleedev 提出了一个很好的观点,即当堆栈大小受到限制时,没有通用的解决方案。我上面描述的假设允许您使用多个堆栈,并且每个堆栈可以容纳与输入中存在的一样多的项目。

【讨论】:

    【解决方案2】:

    我将忽略堆栈大小限制,因为我认为它的含义不清楚。此外,如果您可以使用全部限制为 10 大小的多个堆栈,那么您可以通过使用多个实际堆栈来模拟更大的堆栈。

    因此,这可以通过仅使用 push/pop 的 2 个堆栈来完成。

    1. 将所有内容压入堆栈 A。

    2. 将所有内容从 A 弹出到 B。

    3. 如果 B.empty 返回

    4. 如果 B.top 是双 goto 7

    5. 输出 B.top 并将其从 B 中弹出

    6. 转到 3

    7. 将所有 B 弹出到 A

    8. 虽然 A.top 不是双弹出 A 到 B

    9. 输出 A.top 并将其从 A 中弹出

    10. 转到 2。

    【讨论】:

    • 这可以很容易地修改为使用 3 个堆栈并且是 O(n) 而不是 O(n^2)
    猜你喜欢
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多