题目

栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-of-stacks-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

利用一个辅助栈auxStack,当压入元素val时,进行调整。

调整的方法类似于插入排序,把小于val的值放入辅助栈,待val放入正确位置,再把辅助栈中的元素放入原始栈中。

代码

  1. class SortedStack:
  2. def __init__(self):
  3. self.stack = []
  4. self.auxStack = []
  5. def push(self, val: int) -> None:
  6. if not self.stack or val <= self.peek():
  7. self.stack.append(val)
  8. else:
  9. # 利用auxStack进行插入排序
  10. while True:
  11. compareVal = self.pop()
  12. if val > compareVal and compareVal != -1:
  13. self.auxStack.append(compareVal)
  14. else:
  15. if compareVal != -1:
  16. self.stack.append(compareVal)
  17. self.stack.append(val)
  18. while len(self.auxStack) != 0:
  19. self.stack.append(self.auxStack.pop())
  20. break
  21. def pop(self) -> None:
  22. return self.stack.pop() if self.stack else -1
  23. def peek(self) -> int:
  24. return self.stack[-1] if self.stack else -1
  25. def isEmpty(self) -> bool:
  26. return not bool(self.stack)
  27. # Your SortedStack object will be instantiated and called as such:
  28. # obj = SortedStack()
  29. # obj.push(val)
  30. # obj.pop()
  31. # param_3 = obj.peek()
  32. # param_4 = obj.isEmpty()