定義一個(gè)隊(duì)列,實(shí)現(xiàn)max方法得到隊(duì)列中的最大值。
- 要求入列、出列以及邱最大值的方法時(shí)間復(fù)雜度都是O(1)
private Deque<Integer> dataQueue = new LinkedList<>();
private Deque<Integer> maxQueue = new LinkedList<>();
/**
* 另外加一個(gè)保存最大值的隊(duì)列
* @param number
*/
public void offer(int number) {
dataQueue.offer(number);
// 即將要存入的元素比當(dāng)前隊(duì)列最大值還大,存入該元素
// 即將要存入的元素不超過(guò)當(dāng)前隊(duì)列最大值,再將最大值存入一次
if (maxQueue.isEmpty() || number > maxQueue.peekFirst()) maxQueue.offerFirst(number);
else maxQueue.offerFirst(maxQueue.peekFirst());
}
public void poll() {
//!!!取隊(duì)列和棧時(shí),一定要最空值判斷
if (dataQueue.isEmpty()) throw new RuntimeException("隊(duì)列為空!");
if (maxQueue.peekFirst() == dataQueue.peekFirst()){
maxQueue.pollFirst();
}
dataQueue.pollFirst();
}
public int max() {
//空值判斷?。?!
if (maxQueue.isEmpty()) throw new RuntimeException("隊(duì)列為空!");
return maxQueue.peekFirst();
}
public static void main(String[] args) {
MaxQueue maxQueue = new MaxQueue();
maxQueue.offer(2);
maxQueue.offer(3);
maxQueue.offer(4);
maxQueue.offer(2);
maxQueue.offer(6);
maxQueue.offer(2);
maxQueue.offer(5);
maxQueue.offer(1);
System.out.println(maxQueue.max());
maxQueue.poll();
maxQueue.poll();
maxQueue.poll();
maxQueue.poll();
System.out.println(maxQueue.max());
maxQueue.poll();
System.out.println(maxQueue.max());
maxQueue.poll();
System.out.println(maxQueue.max());
}