队列使用两个堆栈

时间:2011-10-01 18:58:56

标签: arrays stack queue implementation

我将它实现为一个数组,其中两个堆栈彼此相邻,但它们的顶部位于两端。也就是说,如果top(stack1)位于键的开头,则top(stack2)位于键的末尾。底部(Stack1)和底部(Stack2)应该相邻,但顶部(Stack1)和顶部(Stack2)之间的任何位置。要删除,我从顶部(Stack1)弹出,并插入,我推入顶部(stack2)。有人可以告诉我这样做是否正确?

当我阅读CLRS时,我用这种方式解决了问题,并且无法知道它是否是ryt。但是在今天的考试中被问到,后来所有人都在讨论正式的方式(这里和网上的其他地方),所以看来我是唯一一个这样做的人。我真的想知道这是错还是对?请帮忙

4 个答案:

答案 0 :(得分:1)

队列和堆栈是具有明确定义的行为的抽象数据结构,这些数据结构的任何实现都应尊重此合同。

您使用单个阵列实现两个堆栈的想法很好。但是,插入和删除应该在两个堆栈上发生。

例如。假设你有这个设置

2 3 4 5 6

top(stack1)是2
bottom(stack1)是4
top(stack2)是6
bottom(stack2)是5

从stack1弹出3次之后你会到达你的堆栈底部,即4,即使你的QUEUE实现中还有两个元素,也无法再弹出任何内容。因此,需要对您的实施进行一些更正。

所以,如果我要实现两个模拟队列的堆栈,我就是这样做的。

Stack1 2 3 4 5 6本质上是一个数组
2是堆栈的底部,6是堆栈的顶部。

Stack2 empty

将元素插入队列:
这很简单。只需添加到数组的末尾即stack1
栈1 2 3 4 5 6 7
现在7是最重要的。

从队列中删除元素:
1.弹出stack1中的所有元素并将它们插入stack2。所以,你的数组将被颠倒 栈1 empty
stack2 7 6 5 4 3 2。现在2位于堆栈的顶部 2.现在你的top(stack2)将指向2。只是弹出它。 7 6 5 4 3
3.现在对于stack2中的其余元素,从stack2弹出并将它们插入stack1 stack2中empty
stack1 3 4 5 6 7

PS:上述算法假定您知道如何在数组收缩或扩展时管理数组内存。

答案 1 :(得分:0)

我认为你实际上可以使用你所描述的两个相邻堆栈实现一个队列。问题是您不能有效地使用数组实现这两个相邻的堆栈。我的意思是你的队列似乎没问题,但是当你尝试使用底层堆栈时,你会遇到如何在数组的开头插入一个新项目的问题(即推送到stack1)。您需要移动(复制)阵列中的所有项目以将项目推送到stack1。这是糟糕的设计。

答案 2 :(得分:0)

对于那些正在寻找解决方案的人来说,样本就是:

假设我们有两个stacks S1S2 queue具有给定的两种行为:

  1. 入队:将一个元素插入队列。为此,只需按下S1
  2. 即可
  3. Dequeue:逐个弹出S1中的所有元素,同时将它们推入S2。现在从S2弹出。弹出元素是Dequeue的理想结果。
  4. 我们鼓励读者找到更优化的解决方案并尽可能在此发布:)

答案 3 :(得分:0)

这是python中使用两个堆栈的内置数组/列表的示例。

class Queue2Stacks(object):

    def __init__(self):
        self.in_stack = []
        self.out_stack = []

    def enqueue(self, element):
        self.in_stack.append(element)

    def dequeue(self):
        if not self.out_stack:
            while self.in_stack:
                self.out_stack.append(self.in_stack.pop())
        return self.out_stack.pop()