232.用栈实现队列

栈和队列的互相实现 - 图1
在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。
最后如何判断队列为空呢?如果进栈和出栈都为空的话,说明模拟的队列为空了。
在代码实现的时候,会发现pop() 和 peek()两个函数功能类似,代码实现上也是类似的,可以思考一下如何把代码抽象一下。

  1. class MyQueue {
  2. Stack<Integer> stackIn;
  3. Stack<Integer> stackOut;
  4. public MyQueue() {
  5. stackIn = new Stack<>();
  6. stackOut = new Stack<>();
  7. }
  8. public void push(int x) {
  9. stackIn.push(x);
  10. }
  11. public int pop() {
  12. dumpstackIn();
  13. return stackOut.pop();
  14. }
  15. public int peek() {
  16. dumpstackIn();
  17. return stackOut.peek();
  18. }
  19. public boolean empty() {
  20. return stackIn.isEmpty() & stackOut.isEmpty();
  21. }
  22. // 如果stackOut为空,那么将stackIn中的元素全部放到stackOut中
  23. private void dumpstackIn() {
  24. if (!stackOut.isEmpty()) return;
  25. while (!stackIn.isEmpty()) {
  26. stackOut.push(stackIn.pop());
  27. }
  28. }
  29. }

225.用队列实现栈

栈和队列的互相实现 - 图2
如动画所示,用两个队列que1和que2实现队列的功能,que2其实完全就是一个备份的作用,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。

  1. /**
  2. * 使用2个队列
  3. */
  4. class MyStack {
  5. Queue<Integer> queue1; // 和栈一致的队列
  6. Queue<Integer> queue2; // 辅助队列
  7. public MyStack() {
  8. queue1 = new LinkedList<Integer>();
  9. queue2 = new LinkedList<Integer>();
  10. }
  11. public void push(int x) {
  12. // 先将x放入辅助队列中
  13. queue2.offer(x);
  14. // 如果queue中存在元素,将其插入到辅助队列中,使顺序和栈一致
  15. while(!queue1.isEmpty()) {
  16. queue2.offer(queue1.poll());
  17. }
  18. // 将两个队列交换
  19. Queue tempQueue = queue2;
  20. queue2 = queue1;
  21. queue1 = tempQueue;
  22. }
  23. public int pop() {
  24. return queue1.poll();
  25. }
  26. public int top() {
  27. return queue1.peek();
  28. }
  29. public boolean empty() {
  30. return queue1.isEmpty();
  31. }
  32. }
  33. /**
  34. * 使用一个队列实现
  35. */
  36. class MyStack {
  37. Deque<Integer> queue;
  38. public MyStack() {
  39. queue = new ArrayDeque<Integer>(); // 使用双端队列
  40. }
  41. public void push(int x) {
  42. queue.addLast(x);
  43. }
  44. public int pop() {
  45. int size = queue.size();
  46. size--;
  47. // 将除最后一个元素外,前面的再次入栈
  48. while (size-- > 0) {
  49. queue.addLast(queue.peekFirst());
  50. queue.pollFirst();
  51. }
  52. return queue.pollFirst();
  53. }
  54. public int top() {
  55. return queue.peekLast();
  56. }
  57. public boolean empty() {
  58. return queue.isEmpty();
  59. }
  60. }