Arrays 使用两个堆栈排队
我将其实现为一个数组,其中两个堆栈彼此相邻,但它们的顶部位于两端。也就是说,如果top(stack1)位于关键帧的开头,则top(stack2)位于关键帧的末尾。底部(Stack1)和底部(Stack2)应该相邻,但在顶部(Stack1)和顶部(Stack2)之间的任何位置。要删除,我从顶部弹出(Stack1),要插入,我在顶部推(stack2)。有人能告诉我这样做是否正确吗Arrays 使用两个堆栈排队,arrays,stack,queue,implementation,Arrays,Stack,Queue,Implementation,我将其实现为一个数组,其中两个堆栈彼此相邻,但它们的顶部位于两端。也就是说,如果top(stack1)位于关键帧的开头,则top(stack2)位于关键帧的末尾。底部(Stack1)和底部(Stack2)应该相邻,但在顶部(Stack1)和顶部(Stack2)之间的任何位置。要删除,我从顶部弹出(Stack1),要插入,我在顶部推(stack2)。有人能告诉我这样做是否正确吗 当我阅读CLRS时,我用这种方式解决了que,并且没有办法知道它是否是ryt。但是在今天的考试中被问到了这个问题,后来每
当我阅读CLRS时,我用这种方式解决了que,并且没有办法知道它是否是ryt。但是在今天的考试中被问到了这个问题,后来每个人都在讨论官方给出的方式(在这里和网上的其他地方),所以我似乎是唯一一个这样做的人。我真的想知道这是对是错?请帮助队列和堆栈是抽象数据结构,具有定义良好的行为,这些数据结构的任何实现都应遵守本合同 您使用单个数组实现两个堆栈的想法很好。但是,插入和删除应该发生在两个堆栈上 例如,假设你有这个设置
2 3 4 5 6
顶部(堆栈1)为2
底部(堆栈1)为
4
顶部(堆栈2)为
6
底部(堆栈2)为
5
从堆栈1弹出3次后,您将到达堆栈底部,即4
,即使队列中还有两个元素,也无法再弹出任何内容。因此,需要对您的实现进行一些更正
所以,如果我要实现两个模拟队列的堆栈,我会这样做
Stack1:2 3 4 5 6
基本上是一个数组
2
是堆栈的底部,6
是堆栈的顶部
堆栈2:为空
在队列中插入元素:
这很简单。只需添加到数组的末尾,即stack1
堆栈1:234467
现在7
是堆栈的顶部
从队列中删除元素:
1.弹出stack1中的所有元素并将它们插入stack2。因此,您的数组将被反转
堆栈1:为空
堆栈2:7655432
。现在2
位于堆栈顶部。
2.现在,顶部(堆栈2)将指向2
。把它打开。
76543
3.现在,对于stack2中的其余元素,从stack2弹出并将其插入stack1。
堆栈2:为空
堆栈1:34567
PS:上述算法假设您知道如何在阵列收缩或扩展时管理其内存。队列和堆栈是抽象数据结构,具有定义良好的行为,这些数据结构的任何实现都应遵守此约定
您使用单个数组实现两个堆栈的想法很好。但是,插入和删除应该发生在两个堆栈上
例如,假设你有这个设置
2 3 4 5 6
顶部(堆栈1)为2
底部(堆栈1)为4
顶部(堆栈2)为6
底部(堆栈2)为5
从堆栈1弹出3次后,您将到达堆栈底部,即4
,即使队列中还有两个元素,也无法再弹出任何内容。因此,需要对您的实现进行一些更正
所以,如果我要实现两个模拟队列的堆栈,我会这样做
Stack1:2 3 4 5 6
基本上是一个数组
2
是堆栈的底部,6
是堆栈的顶部
堆栈2:为空
在队列中插入元素:
这很简单。只需添加到数组的末尾,即stack1
堆栈1:234467
现在7
是堆栈的顶部
从队列中删除元素:
1.弹出stack1中的所有元素并将它们插入stack2。因此,您的数组将被反转
堆栈1:为空
堆栈2:7655432
。现在2
位于堆栈顶部。
2.现在,顶部(堆栈2)将指向2
。把它打开。
76543
3.现在,对于stack2中的其余元素,从stack2弹出并将其插入stack1。
堆栈2:为空
堆栈1:34567
PS:上述算法假设您知道如何在阵列收缩或扩展时管理其内存。我认为您实际上可以使用您描述的两个相邻堆栈实现队列。问题是,您无法用一个数组高效地实现这两个相邻堆栈。我的意思是您的队列看起来还可以,但是当您尝试使用底层堆栈时,您会遇到如何在数组开头插入新项的问题(即推送到堆栈1)。您需要移动(复制)阵列中的所有项目,才能将项目推入stack1。这是一个糟糕的设计。我认为您实际上可以使用您描述的两个相邻堆栈实现队列。问题是,您无法用一个数组高效地实现这两个相邻堆栈。我的意思是您的队列看起来还可以,但是当您尝试使用底层堆栈时,您会遇到如何在数组开头插入新项的问题(即推送到堆栈1)。您需要移动(复制)阵列中的所有项目,才能将项目推入stack1。这是一个糟糕的设计。对于那些正在寻找解决方案的人来说,下面是一个示例:
假设我们有两个S1
和S2
A具有给定的两种行为:
排队:在队列中插入一个元素。为此,只需推入S1
出列:逐个弹出S1
中的所有元素,同时将它们推入S2
。现在
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()