当前位置:   article > 正文

随笔:实现一个队列,使得取出最大值的时间复杂度较低_stack 去max

stack 去max

该题是《编程之美》中的题目,最后提供的方法看起来挺好玩的,书里的代码看起来好像实现不了,做了下小调整,整成java的,测试可以实现功能。取出最大值的时间复杂度为O(1)。

这个题有几种解法,如引入最大堆,这样取出最大值的时间复杂度为O(1),入队列和出队列的时间复杂度要O(log2N)

提供一种解法:

用栈结构实现取出最大值功能比较简单,而用两个栈可以实现一个队列的功能,所以这道题就用两个具有O(1)时间复杂度取出最大值的栈构成一个队列。

java代码如下:

  1. public class MaxNumFromStack {
  2. public static void main(String[] args) {
  3. // MyStack stack=new MyStack();
  4. // stack.push(2);
  5. // stack.push(3);
  6. // stack.push(4);
  7. // stack.push(5);
  8. // stack.push(1);
  9. // stack.push(10);
  10. // stack.push(8);
  11. // for(int i=0;i<6;i++){
  12. // System.out.println("TheNum:"+stack.pop());
  13. // System.out.println("MaxNum:"+stack.getMax());
  14. // System.out.println("=========================");
  15. // }
  16. MyQueue queue=new MyQueue();
  17. queue.insert(2);
  18. queue.insert(30);
  19. queue.insert(4);
  20. queue.insert(8);
  21. queue.insert(10);
  22. queue.insert(5);
  23. for(int i=0;i<4;i++){
  24. System.out.println("TheNum:"+queue.deQueue());
  25. System.out.println("MaxNum:"+queue.getMax());
  26. System.out.println("============================");
  27. }
  28. }
  29. }
  30. class MyStack{
  31. private int top;
  32. private int maxIndex;
  33. private int MAX;
  34. private int[] data;
  35. private int[] maxStackIndex;
  36. public MyStack(){
  37. MAX=10;
  38. top=-1;
  39. maxIndex=-1;
  40. data=new int[MAX];
  41. maxStackIndex=new int[MAX];
  42. }
  43. //入栈
  44. public void push(int num){
  45. top++;
  46. if(top>=MAX){
  47. System.out.println("栈已满,不能入栈");
  48. return;
  49. }
  50. data[top]=num;//先添加到栈中
  51. if(num>getMax()){//大于当前最大值
  52. maxStackIndex[top]=top;//当前是最大值
  53. maxIndex=top;
  54. }else{
  55. //保留最大的值
  56. maxStackIndex[top]=maxIndex;
  57. }
  58. }
  59. //出栈
  60. public int pop(){
  61. if(top<0){
  62. System.out.println("栈为空,不能出栈");
  63. return Integer.MIN_VALUE;
  64. }
  65. int num=data[top];
  66. if(top==0){
  67. maxIndex=-1;
  68. }else if(top==maxIndex){//当前栈顶是最大值,调整最大值
  69. maxIndex=maxStackIndex[top-1];
  70. }
  71. top--;
  72. return num;
  73. }
  74. public int getMax(){
  75. if(maxIndex>=0){
  76. return data[maxIndex];
  77. }else{
  78. //返回最小值
  79. return Integer.MIN_VALUE;
  80. }
  81. }
  82. public boolean isEmpty(){
  83. return top==-1;
  84. }
  85. }
  86. class MyQueue{
  87. private MyStack stackA=new MyStack();
  88. private MyStack stackB=new MyStack();
  89. public void insert(int num){
  90. stackB.push(num);
  91. }
  92. public int deQueue(){
  93. if(stackA.isEmpty()){
  94. while(!stackB.isEmpty()){
  95. stackA.push(stackB.pop());
  96. }
  97. }
  98. return stackA.pop();
  99. }
  100. public int getMax(){
  101. return max(stackA.getMax(),stackB.getMax());
  102. }
  103. private int max(int a,int b){
  104. return a>b?a:b;
  105. }
  106. }

输入:

  1. TheNum:2
  2. MaxNum:30
  3. ============================
  4. TheNum:30
  5. MaxNum:10
  6. ============================
  7. TheNum:4
  8. MaxNum:10
  9. ============================
  10. TheNum:8
  11. MaxNum:10
  12. ============================


声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
  

闽ICP备14008679号