如何仅使用python中的堆栈操作对堆栈进行排序?

编码员

我有三个堆栈。第一个包含元素。其他的只是为了帮助。如何仅使用 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将是,1stack3将是5->4(这也将是按顺序,特别是降序)。一旦我们推送了3制作stack21->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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章