我将它实现为一个数组,其中两个堆栈彼此相邻,但它们的顶部位于两端。也就是说,如果top(stack1)位于键的开头,则top(stack2)位于键的末尾。底部(Stack1)和底部(Stack2)应该相邻,但顶部(Stack1)和顶部(Stack2)之间的任何位置。要删除,我从顶部(Stack1)弹出,并插入,我推入顶部(stack2)。有人可以告诉我这样做是否正确?
当我阅读CLRS时,我用这种方式解决了问题,并且无法知道它是否是ryt。但是在今天的考试中被问到,后来所有人都在讨论正式的方式(这里和网上的其他地方),所以看来我是唯一一个这样做的人。我真的想知道这是错还是对?请帮忙
答案 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
S1
和S2
queue
具有给定的两种行为:
S1
。S1
中的所有元素,同时将它们推入S2
。现在从S2
弹出。弹出元素是Dequeue的理想结果。我们鼓励读者找到更优化的解决方案并尽可能在此发布:)
答案 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()