|
1 | 1 | package Chap6; |
2 | 2 |
|
3 | 3 | import java.util.Deque; |
| 4 | +import java.util.Queue; |
4 | 5 | import java.util.LinkedList; |
5 | 6 |
|
6 | 7 | /** |
7 | 8 | * 定义一个队列,实现max方法得到队列中的最大值。 |
8 | 9 | * 要求入列、出列以及邱最大值的方法时间复杂度都是O(1) |
9 | 10 | */ |
10 | 11 | public class MaxQueue { |
11 | | - private Deque<Integer> maxDeque = new LinkedList<>(); |
12 | | - private Deque<Integer> dataDeque = new LinkedList<>(); |
13 | | - |
14 | | - public void offer(int number) { |
15 | | - dataDeque.offerLast(number); |
16 | | - // 即将要存入的元素比当前队列最大值还大,存入该元素 |
17 | | - if (maxDeque.isEmpty() || number > maxDeque.peekFirst()) maxDeque.offerFirst(number); |
18 | | - // 即将要存入的元素不超过当前队列最大值,再将最大值存入一次 |
19 | | - else maxDeque.offerFirst(maxDeque.peekFirst()); |
20 | | - } |
21 | 12 |
|
22 | | - public void poll() { |
23 | | - if (dataDeque.isEmpty()) throw new RuntimeException("队列已空"); |
24 | | - dataDeque.pollFirst(); |
25 | | - maxDeque.pollFirst(); |
| 13 | + private Queue<Integer> queue; |
| 14 | + private Deque<Integer> maxQueue; |
| 15 | + |
| 16 | + |
| 17 | + public MaxQueue() { |
| 18 | + queue = new LinkedList<>(); |
| 19 | + maxQueue = new LinkedList<>(); |
26 | 20 | } |
27 | 21 |
|
28 | | - public int max() { |
29 | | - if (maxDeque.isEmpty()) throw new RuntimeException("队列已空"); |
30 | | - return maxDeque.peekFirst(); |
| 22 | + public int max_value() { |
| 23 | + if (maxQueue.isEmpty()) { |
| 24 | + return -1; |
| 25 | + } |
| 26 | + return maxQueue.peekFirst(); |
31 | 27 | } |
32 | 28 |
|
33 | | - public static void main(String[] args) { |
34 | | - MaxQueue maxQueue = new MaxQueue(); |
35 | | - maxQueue.offer(2); |
36 | | - maxQueue.offer(3); |
37 | | - maxQueue.offer(4); |
38 | | - maxQueue.offer(2); |
39 | | - maxQueue.offer(6); |
40 | | - maxQueue.offer(2); |
41 | | - maxQueue.offer(5); |
42 | | - maxQueue.offer(1); |
43 | | - |
44 | | - System.out.println(maxQueue.max()); |
45 | | - maxQueue.poll(); |
46 | | - maxQueue.poll(); |
47 | | - maxQueue.poll(); |
48 | | - maxQueue.poll(); |
49 | | - System.out.println(maxQueue.max()); |
50 | | - maxQueue.poll(); |
51 | | - System.out.println(maxQueue.max()); |
52 | | - maxQueue.poll(); |
53 | | - System.out.println(maxQueue.max()); |
| 29 | + public void push_back(int value) { |
| 30 | + queue.offer(value); |
| 31 | + while (!maxQueue.isEmpty() && value > maxQueue.peekLast()) { |
| 32 | + maxQueue.pollLast(); |
| 33 | + } |
| 34 | + maxQueue.offerLast(value); |
54 | 35 |
|
55 | 36 | } |
| 37 | + |
| 38 | + public int pop_front() { |
| 39 | + if (queue.isEmpty()) { |
| 40 | + return -1; |
| 41 | + } |
| 42 | + int tmp = queue.poll(); |
| 43 | + if (tmp == maxQueue.peekFirst()) { |
| 44 | + maxQueue.pollFirst(); |
| 45 | + } |
| 46 | + return tmp; |
| 47 | + } |
| 48 | + |
56 | 49 | } |
| 50 | + |
0 commit comments