1, 题目

使用队列实现栈的下列操作:

  1. push(x) -- 元素 x 入栈
  2. pop() -- 移除栈顶元素
  3. top() -- 获取栈顶元素
  4. empty() -- 返回栈是否为空

注意:

  1. 你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, is empty 这些操作是合法的。
  2. 你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
  3. 你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。

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

2, 算法

  1. class MyStack() {
  2. /** Initialize your data structure here. */
  3. var main_queue = scala.collection.mutable.Queue[Int]()
  4. var aux_queue = scala.collection.mutable.Queue[Int]()
  5. var t: Int = 0
  6. /** Push element x onto stack. */
  7. def push(x: Int): Unit = {
  8. main_queue.enqueue(x)
  9. t = x
  10. }
  11. /** Removes the element on top of the stack and returns that element. */
  12. def pop(): Int = {
  13. while (main_queue.size > 1) {
  14. if (main_queue.size == 2) {
  15. t = main_queue.front
  16. }
  17. aux_queue.enqueue(main_queue.dequeue())
  18. }
  19. val p = main_queue.dequeue()
  20. val tmp = main_queue
  21. main_queue = aux_queue
  22. aux_queue = tmp
  23. p
  24. }
  25. /** Get the top element. */
  26. def top(): Int = {
  27. t
  28. }
  29. /** Returns whether the stack is empty. */
  30. def empty(): Boolean = {
  31. main_queue.isEmpty
  32. }
  33. }
  1. import queue
  2. class MyStack:
  3. def __init__(self):
  4. """
  5. Initialize your data structure here.
  6. """
  7. self.t = 0
  8. self.main_queue = queue.Queue()
  9. self.aux_queue = queue.Queue()
  10. def push(self, x: int) -> None:
  11. """
  12. Push element x onto stack.
  13. """
  14. self.t = x
  15. self.main_queue.put(x)
  16. def pop(self) -> int:
  17. """
  18. Removes the element on top of the stack and returns that element.
  19. """
  20. while self.main_queue.qsize() > 1:
  21. if self.main_queue.qsize() == 2:
  22. self.t = self.main_queue.get()
  23. self.aux_queue.put(self.t)
  24. else:
  25. self.aux_queue.put(self.main_queue.get())
  26. tmp = self.main_queue.get()
  27. self.main_queue, self.aux_queue = self.aux_queue, self.main_queue
  28. return tmp
  29. def top(self) -> int:
  30. """
  31. Get the top element.
  32. """
  33. return self.t
  34. def empty(self) -> bool:
  35. """
  36. Returns whether the stack is empty.
  37. """
  38. if self.main_queue.qsize()!=0:
  39. return False
  40. else:
  41. return True