我有三个堆栈。第一个包含元素。其他的只是为了帮助。如何仅使用 push、pop、peek 和 empty 运算符对堆栈进行排序?这就是我所做的。
def sort(stack1, stack2, stack3):
while not stack1.empty():
temp = stack1.pop()
while not stack2.empty() and stack2.peek() > temp:
stack1.push(stack2.pop())
stack2.push(temp)
return stack1
您似乎没有使用 ,stack3
这意味着stack2
它是大于的项目的临时持有者temp
。另外,不要修改stack1
,除了它只包含未排序的源项这一事实之外,您还要推入它然后弹出,这将是一个无休止的循环。
为了您的指导,以下是堆栈的作用:
stack1
- 包含原始数据。就是这样,仅此而已。你应该只弹出它的项目直到空。但是当然,在获取每个项目时,请确保您的其他堆栈维护一组已排序的项目。stack2
- 包含排序的数据。这是你应该返回的。必须将项目按排序保存在此处。stack3
- 中已排序项目的临时持有人stack2
。假设stack2
有 items 1->4->5
。对于我们3
在保持顺序的同时插入,我们不能只是将它推到最上面,因为那样会使其成为1->4->5->3
。相反,我们将继续弹出已经排序的数据并将其暂时放入,stack3
直到我们已经可以插入的点3
。因此,stack2
将是,1
而stack3
将是5->4
(这也将是按顺序,特别是降序)。一旦我们推送了3
制作stack2
为1->3
,我们就可以返回我们暂时存储在这里的项目,stack3
从而将其带回1->3->4->5
。class Stack(list):
def empty(self):
return len(self) == 0
def push(self, value):
self.append(value)
def peek(self):
return self[-1]
def sort(stack1, stack2, stack3):
while not stack1.empty():
temp = stack1.pop()
while not stack2.empty() and stack2.peek() > temp:
stack3.push(stack2.pop())
stack2.push(temp)
while not stack3.empty():
stack2.push(stack3.pop())
return stack2
print(sort(Stack([1,5,4,2,3]), Stack(), Stack()))
print(sort(Stack([5,4,3,1,2]), Stack(), Stack()))
print(sort(Stack([1,2,3,5,4]), Stack(), Stack()))
输出:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句