Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用两个堆栈排队_Arrays_Stack_Queue_Implementation - Fatal编程技术网

Arrays 使用两个堆栈排队

Arrays 使用两个堆栈排队,arrays,stack,queue,implementation,Arrays,Stack,Queue,Implementation,我将其实现为一个数组,其中两个堆栈彼此相邻,但它们的顶部位于两端。也就是说,如果top(stack1)位于关键帧的开头,则top(stack2)位于关键帧的末尾。底部(Stack1)和底部(Stack2)应该相邻,但在顶部(Stack1)和顶部(Stack2)之间的任何位置。要删除,我从顶部弹出(Stack1),要插入,我在顶部推(stack2)。有人能告诉我这样做是否正确吗 当我阅读CLRS时,我用这种方式解决了que,并且没有办法知道它是否是ryt。但是在今天的考试中被问到了这个问题,后来每

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


当我阅读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()