剑指Offer面试题7:用两个栈实现队列 Java实现

来源:互联网 发布:腾讯光子工作室 知乎 编辑:程序博客网 时间:2024/05/20 06:31
题目:用两个栈实现队列
            队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。
算法分析:
        我们通过一个具体的例子来分析该队列插入和删除元素的过程。首先插入一个元素a,不妨先把它插入到stack1,此时stack1 中的元素有{a},stack2为空。再压入两个元素b和c,还是插入到stack1中,此时stack1中的元素有{a,b,c},其中c位于栈顶,而stack2仍然为空。
这个时候,我们试着删除从队列中删除一个元素。按照队列先入先出的规则,由于a比b、c先插入到队列中,最先被删除的元素应该是a。元素a存储在stack1中,但并不在占顶上,因此不能直接被删除。注意到stack2我们还一直没有使用过,现在是让stack2发挥作用的时候了。如果我们把stack1中的元素逐个弹出并压入stack2,元素在stack2中的顺序正好和原来的stack1中的顺序相反。因此经过3次弹出stack1和压入stack2操作之后,stack1为空,而stack2中的元素是{c,b,a},这个时候就可以弹出stack2的栈顶a了。此时的stack1为空,而stack2的元素为{c,b},其中在栈顶,如图所示:
 
算法源程序:

  1. /**************************************************************
  2. * Copyright (c) 2016, 北京邮电大学
  3. * All rights reserved.
  4. * 版 本 号:v1.0
  5. * 题目描述:用两个栈实现队列
  6. * 队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。
  7. * 输入描述:请输入要插入到栈中的内容,以空格隔开:
  8. *1 3 5 7 9
  9. * 程序输出: 两个栈实现队列的结果为:
  10. *1 3 5 7 9
  11. * 问题分析:无
  12. * 算法描述: 我们通过一个具体的例子来分析该队列插入和删除元素的过程。首先插入一个元素a,不妨先把它插入到stack1,此时stack1 中的元素有{a},
  13. * stack2为空。再压入两个元素b和c,还是插入到stack1中,此时stack1中的元素有{a,b,c},其中c位于栈顶,而stack2仍然为空。
  14. *这个时候,我们试着删除从队列中删除一个元素。按照队列先入先出的规则,由于a比b、c先插入到队列中,
  15. *最先被删除的元素应该是a。元素a存储在stack1中,但并不在占顶上,因此不能直接被删除。
  16. *注意到stack2我们还一直没有使用过,现在是让stack2发挥作用的时候了。如果我们把stack1中的元素逐个弹出并压入stack2,
  17. *元素在stack2中的顺序正好和原来的stack1中的顺序相反。因此经过3次弹出stack1和压入stack2操作之后,
  18. *stack1为空,而stack2中的元素是{c,b,a},这个时候就可以弹出stack2的栈顶a了。
  19. *此时的stack1为空,而stack2的元素为{c,b},其中在栈顶
  20. * 完成时间:2016-10-30
  21. ***************************************************************/
  22. package org.marsguo.offerproject07;
  23. import java.util.Scanner;
  24. import java.util.Stack;
  25. class SolutionMethod1{
  26. Stack<Integer> stack1 = new Stack<Integer>();//插入栈,用于插入数据
  27. Stack<Integer> stack2 = new Stack<Integer>();//弹出栈,用于弹出数据
  28. public void StackPush(int[] arr){
  29. for(int i = 0; i < arr.length; i++){
  30. stack1.push(arr[i]);
  31. }
  32. }
  33. public int StackPop(){
  34. if(stack1.isEmpty() && stack2.isEmpty()){
  35. throw new RuntimeException("Queue is Empty");
  36. }
  37. if(stack2.empty()){
  38. while(!stack1.isEmpty()){
  39. stack2.push(stack1.pop());//将stack1出栈的内容压入stack2中
  40. }
  41. }
  42. return stack2.pop();
  43. }
  44. }
  45. /*
  46. 算法2.采用模板类来创建,这样输入队列中的数据就可以是任意类型的
  47. */
  48. class SolutionMethod2{
  49. public class MList<T>{
  50. public Stack<T> stack1 = new Stack<>();
  51. public Stack<T> stack2 = new Stack<>();
  52. public MList(){
  53. }
  54. public void appendTail(T t){
  55. stack1.add(t);//在队列尾部插入节点
  56. }
  57. public T deleteHead(){
  58. if(stack2.isEmpty()){
  59. while(!stack1.isEmpty()){
  60. stack2.add(stack1.pop());
  61. }
  62. }
  63. if(stack2.isEmpty()){
  64. throw new RuntimeException("NO more element");
  65. }
  66. return stack2.pop();
  67. }
  68. }
  69. }
  70. public class StackToQueue {
  71. public static void main(String[] args){
  72. Scanner scanner = new Scanner(System.in);
  73. System.out.println("请输入要插入到栈中的内容,以空格隔开:");
  74. String str = scanner.nextLine();
  75. String[] temp = str.split(" ");
  76. int[] array = new int[temp.length];
  77. for(int i = 0;i < temp.length;i++)
  78. {
  79. array[i] = Integer.parseInt(temp[i]);
  80. }
  81. scanner.close();
  82. SolutionMethod1 solution1 = new SolutionMethod1();
  83. System.out.println("两个栈实现队列的结果为:");
  84. solution1.StackPush(array);
  85. System.out.print(solution1.StackPop() + " ");
  86. while(!solution1.stack2.isEmpty()){
  87. System.out.print(solution1.StackPop() + " ");
  88. }
  89. //System.out.println(solution1.StackPop());
  90. /*for(int i = 0; i < array.length; i++){
  91. solution1.StackPush(array[i]);
  92. }*/
  93. }
  94. }
程序运行结果:

 
0 0
原创粉丝点击