赞
踩
该题是《编程之美》中的题目,最后提供的方法看起来挺好玩的,书里的代码看起来好像实现不了,做了下小调整,整成java的,测试可以实现功能。取出最大值的时间复杂度为O(1)。
这个题有几种解法,如引入最大堆,这样取出最大值的时间复杂度为O(1),入队列和出队列的时间复杂度要O(log2N)
提供一种解法:
用栈结构实现取出最大值功能比较简单,而用两个栈可以实现一个队列的功能,所以这道题就用两个具有O(1)时间复杂度取出最大值的栈构成一个队列。
java代码如下:
- public class MaxNumFromStack {
- public static void main(String[] args) {
-
- // MyStack stack=new MyStack();
- // stack.push(2);
- // stack.push(3);
- // stack.push(4);
- // stack.push(5);
- // stack.push(1);
- // stack.push(10);
- // stack.push(8);
- // for(int i=0;i<6;i++){
- // System.out.println("TheNum:"+stack.pop());
- // System.out.println("MaxNum:"+stack.getMax());
- // System.out.println("=========================");
- // }
- MyQueue queue=new MyQueue();
- queue.insert(2);
- queue.insert(30);
- queue.insert(4);
- queue.insert(8);
- queue.insert(10);
- queue.insert(5);
- for(int i=0;i<4;i++){
- System.out.println("TheNum:"+queue.deQueue());
- System.out.println("MaxNum:"+queue.getMax());
- System.out.println("============================");
- }
- }
- }
- class MyStack{
- private int top;
- private int maxIndex;
- private int MAX;
- private int[] data;
- private int[] maxStackIndex;
- public MyStack(){
- MAX=10;
- top=-1;
- maxIndex=-1;
- data=new int[MAX];
- maxStackIndex=new int[MAX];
- }
- //入栈
- public void push(int num){
- top++;
- if(top>=MAX){
- System.out.println("栈已满,不能入栈");
- return;
- }
- data[top]=num;//先添加到栈中
- if(num>getMax()){//大于当前最大值
- maxStackIndex[top]=top;//当前是最大值
- maxIndex=top;
- }else{
- //保留最大的值
- maxStackIndex[top]=maxIndex;
- }
- }
- //出栈
- public int pop(){
- if(top<0){
- System.out.println("栈为空,不能出栈");
- return Integer.MIN_VALUE;
- }
- int num=data[top];
- if(top==0){
- maxIndex=-1;
- }else if(top==maxIndex){//当前栈顶是最大值,调整最大值
- maxIndex=maxStackIndex[top-1];
- }
- top--;
- return num;
- }
- public int getMax(){
- if(maxIndex>=0){
- return data[maxIndex];
- }else{
- //返回最小值
- return Integer.MIN_VALUE;
- }
- }
- public boolean isEmpty(){
- return top==-1;
- }
- }
- class MyQueue{
- private MyStack stackA=new MyStack();
- private MyStack stackB=new MyStack();
- public void insert(int num){
- stackB.push(num);
- }
- public int deQueue(){
- if(stackA.isEmpty()){
- while(!stackB.isEmpty()){
- stackA.push(stackB.pop());
- }
- }
- return stackA.pop();
- }
- public int getMax(){
- return max(stackA.getMax(),stackB.getMax());
- }
- private int max(int a,int b){
- return a>b?a:b;
- }
- }
- TheNum:2
- MaxNum:30
- ============================
- TheNum:30
- MaxNum:10
- ============================
- TheNum:4
- MaxNum:10
- ============================
- TheNum:8
- MaxNum:10
- ============================
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。