堆栈和队列的相互实现

https://blog.csdn.net/upupday19/article/details/79250085

需求:

堆栈特点是先进后出,队列特点是先进先出。二者有一定联系,可以使用两个队列实现堆栈,也可以用两个堆栈实现队列。

分析:

 1、两个堆栈实现队列(有两个堆栈stack1,stack2)
 添加:添加到stack1中
 删除队列头部元素:如果两个堆栈都是空的,那么抛出异常。如果stack2非空,将栈顶pop,如果stack2是空的,判断stack1大小是否是1,如果是1,那么直接pop返回栈顶元素即可,如果不是就把stack1元素pop到stack2中,然后pop返回stack2栈顶元素即可
 2、两个队列实现堆栈(有两个队列queue1,queue2)
 添加:添加到非空的队列中,如果两个都是空的,添加到queue1中
 删除栈顶元素:判断是否有非空队列,如果没有,抛出异常,如果有,判断非空的队列长度是否是1,如果是1,直接poll即可,如果不是1,那么需要使用poll删除队列头部,然后添加到另一个队列中,直到只剩下1个元素,该元素即为栈顶元素,poll删除返回即可

代码:

  1. import java.util.*;
  2. class StackQueue{
  3. Stack<Integer> stack1 = new Stack<Integer>();
  4. Stack<Integer> stack2 = new Stack<Integer>();
  5. Queue<Integer> queue1 = new ArrayDeque<Integer>();
  6. Queue<Integer> queue2 = new ArrayDeque<Integer>();
  7. //堆栈实现队列添加元素
  8. public void queuePush(int node){
  9. stack1.push(node);
  10. }
  11. //堆栈实现队列删除头部元素
  12. public int queuePop(){
  13. //如果两堆栈都是空的,那么抛出异常
  14. if(stack1.empty() && stack2.empty())
  15. throw new RuntimeException( "stack null!!");
  16. //如果stack2非空,直接pop即可
  17. if(!stack2.empty()){
  18. return stack2.pop();
  19. }
  20. //如果stack2空的,就将stack1元素pop然后push到stack2中,然后pop
  21. //如果stack1的元素只有一个,那么直接pop也可以
  22. if(stack1.size() == 1)
  23. return stack1.pop();
  24. while(!stack1.empty()){
  25. stack2.push(stack1.pop());
  26. }
  27. return stack2.pop();
  28. }
  29. //队列实现堆栈添加元素
  30. public void stackPush(int node){
  31. if(queue1.isEmpty() && queue2.isEmpty()){
  32. queue1.offer(node);
  33. }
  34. else if(!queue1.isEmpty()){
  35. queue1.offer(node);
  36. }
  37. else{
  38. queue2.offer(node);
  39. }
  40. }
  41. //队列实现堆栈删除栈顶元素
  42. public int stackPop(){
  43. //如果两个队列都是空的,那么抛出异常
  44. if(queue1.isEmpty() && queue2.isEmpty()){
  45. throw new RuntimeException( "queue null!!");
  46. }
  47. //正常情况下应该最多有一个队列非空
  48. //如果queue1非空
  49. if(!queue1.isEmpty()){
  50. //如果队列长度是1,那么直接poll即可
  51. if(queue1.size() == 1)
  52. return queue1.poll();
  53. //将queue1中元素poll删除然后添加到queue2中,直到queue1元素个数是1,然后poll返回即可
  54. while(queue1.size() > 1){
  55. queue2.offer(queue1.poll());
  56. }
  57. return queue1.poll();
  58. }
  59. //如果queue2非空
  60. //如果queue2长度是1,那么抛出异常
  61. if(queue2.size() == 1)
  62. return queue2.poll();
  63. while(queue2.size() > 1){
  64. queue1.offer(queue2.poll());
  65. }
  66. return queue2.poll();
  67. }
  68. }
  69. class StackQueueDemo{
  70. public static void main(String[] args){
  71. StackQueue sq = new StackQueue();
  72. //堆栈实现队列
  73. System.out.println( "向队列中添加1,2,3,4");
  74. sq.queuePush( 1);
  75. sq.queuePush( 2);
  76. sq.queuePush( 3);
  77. sq.queuePush( 4);
  78. System.out.println( "依次删除队列头部");
  79. for( int i = 0; i < 4; i++)
  80. System.out.println(sq.queuePop());
  81. //队列实现堆栈
  82. System.out.println( "向堆栈中添加1,2,3,4");
  83. sq.stackPush( 1);
  84. sq.stackPush( 2);
  85. sq.stackPush( 3);
  86. sq.stackPush( 4);
  87. System.out.println( "依次删除栈顶元素");
  88. for( int i = 0; i < 4; i++)
  89. System.out.println(sq.stackPop());
  90. //测试队列性能
  91. //依次输出190,100,200
  92. sq.queuePush( 190);
  93. sq.queuePush( 100);
  94. System.out.println(sq.queuePop());
  95. sq.queuePush( 200);
  96. System.out.println(sq.queuePop());
  97. System.out.println(sq.queuePop());
  98. //测试堆栈性能
  99. //依次输出19,20,18
  100. sq.stackPush( 18);
  101. sq.stackPush( 19);
  102. System.out.println(sq.stackPop());
  103. sq.stackPush( 20);
  104. System.out.println(sq.stackPop());
  105. System.out.println(sq.stackPop());
  106. }
  107. }

猜你喜欢

转载自blog.csdn.net/qq_20398345/article/details/80885181