题目:请定义一个队列并实现函数max得到队列里的最大值,要求函数max、
push_back和pop_front的时间复杂度都是O(1)。
一个dataQueue正常入列、出列元素,为了以O(1)的时间获取当前队列的最大值,
需要使用一个maxQueue存放当前队列中最大值。具体来说就是,
如果即将要存入的元素比当前最大值还大,那么存入这个元素;否则再次存入当前最大值。
当数据队列新增加的元素比之前队列的数据中的一个元素大时,将那个较小的元素删除。
ArrayDeque<Integer> dataQueue=new ArrayDeque();
ArrayDeque<Integer> maxQueue=new ArrayDeque();
//
private int pop_front() {//弹出前面的数据
int i=dataQueue.getFirst();
if(dataQueue.isEmpty()){
System.out.println("队列为空,无法弹出");
}else if(i==max()){
maxQueue.removeFirst();
}
dataQueue.removeFirst();
return i;
}
private void push_back(int num) {
//将数据放到后面
while (!maxQueue.isEmpty()&&num>maxQueue.getLast()){
maxQueue.removeLast();
}
maxQueue.addLast(num);
dataQueue.addLast(num);
}
public int max(){
if(maxQueue.isEmpty()){
throw new RuntimeException();
}
;
//System.out.println(maxQueue.getFirst());
return maxQueue.getFirst();
}