Algorithm 堆栈问题:以模式弹出

Algorithm 堆栈问题:以模式弹出,algorithm,string,stack,double,Algorithm,String,Stack,Double,在运行时,我想输入两种数据类型,double和string。 其中一个条件是字符串应该按照我输入的顺序弹出,而double将像通常的堆栈行为LIFO一样弹出。另一个条件是堆栈的最大大小限制为10 例如,一个运行时示例 输入你好1世界2废话3 4 5 输出Hello 5 World 4废话3 2 1 我的第一个问题是有多少种方法可以解决这个问题? 我用3个堆栈解决了这个问题,一个存储双堆栈,一个存储字符串,还有一个用于反转字符串顺序 我需要保存模式,以便程序知道double的顺序,因此我将模式保存

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

例如,一个运行时示例

输入
你好1世界2废话3 4 5

输出
Hello 5 World 4废话3 2 1

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

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

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

  • 你好*
  • 世界*
  • 废话
  • 废话***
  • 因此,当第一次读取时,我需要在堆栈位置进行特定读取,并从中提取Hello。当我告诉程序下一个pop是双精度的时候,星号*会留作以后使用


    我的第二个问题是,我想知道是否有其他更优雅的方法来解决这个问题。因为我的解决方案将涉及一些字符串操作来解决这个问题。至于现在,我并没有像应该使用的那样在字符串中使用pop函数。在C++ BWT.< /P> < P>中,我的解决方法很好,除了如果必须使用堆栈,则不允许访问堆栈中的随机位置——只能推/弹出-而且修改输入字符串并存储星号不是那么好。 您可以仅使用具有5个堆栈的push/pop操作来解决此问题(从技术上讲,一次只能使用4个堆栈,但由于它们的类型不同,您需要在程序中声明所有5个堆栈):

    堆栈1:按输入顺序推双

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

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

    堆栈4:颠倒堆栈2中字符串的顺序

    堆栈5:颠倒堆栈3中数据类型的顺序

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


    编辑:@jleedev指出,当堆栈大小受到限制时,没有通用的解决方案。我上面描述的假设是允许您使用多个堆栈,每个堆栈可以容纳输入中存在的尽可能多的项。

    我将忽略堆栈大小约束,因为我认为它的含义不清楚。此外,如果可以使用多个堆栈(所有堆栈的大小限制为10),则可以使用多个实际堆栈模拟更大的堆栈

    因此,这可以用两个堆栈来完成,只使用push/pop

  • 把所有东西都推到堆栈A上

  • 把所有的东西从A弹到B

  • 如果B.空返回

  • 如果B.top是双转到7

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

  • 转到3

  • 把B全部放在A上

  • 而A.top不是A到B的双重弹出

  • 输出A.top并将其从

  • 转到2


  • 通常的堆栈行为,FIFO——不,堆栈是后进先出,FIFO被称为“队列”。你必须使用堆栈还是使用其他结构?@imz:啊,是的,我会编辑it@casablanca:是的,我必须使用Stack,因为不可能有一个通用的解决方案。如果堆栈有10个条目,您需要输出一个数字,但最后一个数字尚未到达,您该怎么办?可以很容易地修改为使用3个堆栈,并将其改为O(n)而不是O(n^2)