该题是《编程之美》中的题目,最后提供的方法看起来挺好玩的,书里的代码看起来好像实现不了,做了下小调整,整成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
============================