双端队列基础
- Deque:头尾都可进可出
- 常见操作:
- 头插
insertFront(x)
、尾插insertLast(x)
- 头删
deleteFront()
、尾删deleteLast()
- 取头
getFront()
、取尾getRear()
- 判空
isEmpty()
、判满isFull()
(固定容量时)
- 头插
链表版双端队列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import java.util.Deque;
import java.util.LinkedList;
public class Code_09 {
// 1) 基于 JDK 双端链表的定长 Deque
class MyCircularDeque1 {
public Deque<Integer> deque = new LinkedList<>();
public int size;
public int limit;
public MyCircularDeque1(int k){
size = 0;
limit = k;
}
public boolean insertFront(int value){
if (isFull()) return false;
deque.offerFirst(value);
size++;
return true;
}
public boolean insertLast(int value){
if (isFull()) return false;
deque.offerLast(value);
size++;
return true;
}
public boolean deleteFront(){
if (isEmpty()) return false;
deque.pollFirst();
size--;
return true;
}
public boolean deleteLast(){
if (isEmpty()) return false;
deque.pollLast();
size--;
return true;
}
public int getFront(){
return isEmpty() ? -1 : deque.peekFirst();
}
public int getRear(){
return isEmpty() ? -1 : deque.peekLast();
}
public boolean isEmpty(){
return size == 0;
}
public boolean isFull(){
return size == limit;
}
}
数组版环形双端队列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
class MyCircularDeque2{
public int[] deque;
public int l, r, size, limit;
public MyCircularDeque2(int k){
deque = new int[k];
l = r = size = 0;
limit = k;
}
// 头插
public boolean insertFront(int value){
if (isFull()) return false;
if (isEmpty()) {
l = r = 0;
deque[l] = value;
} else {
l = (l == 0) ? (limit - 1) : (l - 1);
deque[l] = value;
}
size++;
return true;
}
// 尾插
public boolean insertLast(int value){
if (isFull()) return false;
if (isEmpty()) {
l = r = 0;
deque[r] = value;
} else {
r = (r == limit - 1) ? 0 : (r + 1);
deque[r] = value;
}
size++;
return true;
}
// 头删
public boolean deleteFront(){
if (isEmpty()) return false;
if (size == 1) {
// 删成空,l/r 复位可选
// l = r = 0; // 可省略:只要 size=0,l/r 值无影响
} else {
l = (l == limit - 1) ? 0 : (l + 1);
}
size--;
return true;
}
// 尾删
public boolean deleteLast(){
if (isEmpty()) return false;
if (size == 1) {
// 同上
// l = r = 0;
} else {
r = (r == 0) ? (limit - 1) : (r - 1);
}
size--;
return true;
}
public int getFront(){
return isEmpty() ? -1 : deque[l];
}
public int getRear(){
return isEmpty() ? -1 : deque[r];
}
public boolean isEmpty(){
return size == 0;
}
public boolean isFull(){
return size == limit;
}
}
}