文章目录
- 实现双端队列(理解源码)
- 步骤一:定义接口:Dequeue、Stack
- 步骤二:定义ArrayDeque类,实现Dequeue,Stack,同时让该类支持泛型。
实现双端队列(理解源码)
队列,作为一种特殊的数据结构;具有先进先出的特点,双端队列是指“可以在队首队尾都可以增删元素”的一种数据结构
步骤一:定义接口:Dequeue、Stack
定义两个接口(Dequeue、Stack),然后让我们创建的ArrayDeque类实现这两个接口。
Dequeue接口:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21public interface Dequeue<E> extends Queue<E>{ public void addFirst(E element);//在队首添加元素 public void addLast(E element);//在队尾添加元素 public E removeFirst(); public E removeLast(); public E getFirst(); public E getLast(); } //在这里让我们的Dequeue继承自该接口 public interface Queue <E> extends Iterable<E> { public void offer(E element); public E poll(); public E peek(); public E element(); //查看队首元素 public boolean isEmpty(); public void clear(); public int size(); public Iterator<E> iterator(); }
Stack接口:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12public interface Stack<E> extends Iterable<E> { public int size();//获取栈中元素个数 public boolean isEmpty(); //入栈 进栈一个元素 在线性表的表尾添加一个元素 public void push(E element); //出栈 弹出一个元素 在线性表的表尾删除一个元素 public E pop(); //查看当前栈顶元素 并不是移除 =》查看线性表中最后一个元素 public E peek(); public void clear(); }
步骤二:定义ArrayDeque类,实现Dequeue,Stack,同时让该类支持泛型。
源代码实现:
复制代码
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182//双端队列 import java.util.Iterator; public class ArrayDeque<E> implements Dequeue<E>, Stack<E>{ private E[] data; private int front;//队首指针 private int rear; private int size; private static int DEFAULT_CAPACITY = 10; public ArrayDeque(){ data = (E[]) new Object[DEFAULT_CAPACITY + 1];//rear指向null的 front = 0; rear = 0; size = 0; } @Override public void addFirst(E element){ if((rear + 1) % data.length == front){ //双端队列满 resize(data.length * 2 - 1); } front = (front - 1 + data.length) % data.length; data[front] = element; size++; } private void resize(int newLen){ E[] newData = (E[]) new Object[newLen]; int index = 0; for(int i = front; i != rear; i = (i + 1) % data.length){ newData[index++] = data[i]; } data = newData; front = 0; rear = index; } @Override public void addLast(E element){ if((rear + 1) % data.length == front){ resize(data.length * 2 - 1); } data[rear] = element; rear = (rear + 1) % data.length; size++; } @Override public E removeFirst(){ if(isEmpty()){ throw new IllegalArgumentException("queue is null"); } E ret = data[front]; front = (front + 1) % data.length; size--; if(size <= (data.length - 1) / 4 && data.length - 1 > DEFAULT_CAPACITY){ resize(data.length / 2 + 1); } return ret; } @Override public E removeLast(){ if(isEmpty()){ throw new IllegalArgumentException("queue is null"); } rear = (rear - 1 + data.length) % data.length; E ret = data[rear]; size--; if(size <= (data.length - 1) / 4 && data.length - 1 > DEFAULT_CAPACITY){ resize(data.length / 2 + 1); } return ret; } @Override public E getFirst(){ if(isEmpty()){ throw new IllegalArgumentException("queue is null"); } return data[front]; } @Override public E getLast(){ if(isEmpty()){ throw new IllegalArgumentException("queue is null"); } return data[(rear - 1 + data.length) % data.length]; } @Override public void offer(E element) { //实现队列的入队 addLast(element); } @Override public E poll() { return removeFirst(); } @Override public E element() { return getFirst(); } @Override public E peek() { //获取栈顶元素 return getLast(); } @Override public boolean isEmpty() { return size == 0 && front == rear; } @Override public void push(E element) { //入栈一个元素 addLast(element); } @Override public E pop() { return removeLast(); } @Override public void clear() { E[] data = (E[]) new Object[DEFAULT_CAPACITY]; front = 0; rear = 0; size = 0; } @Override public int size() { return size; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append('['); if (isEmpty()) { sb.append(']'); return sb.toString(); } for (int i = front; i != rear; i = (i + 1) % data.length) { sb.append(data[i]); if ((i + 1) % data.length == rear) { sb.append(']'); } else { sb.append(','); sb.append(' '); } } //表明当前队列遍历完成 return sb.toString(); } @Override public Iterator<E> iterator() { return new ArrayDequeIterator(); } class ArrayDequeIterator implements Iterator<E> { private int cur = front; @Override public boolean hasNext() { return cur != rear; } @Override public E next() { E ret = data[cur]; cur = (cur + 1) % data.length; return ret; } } }
最后
以上就是开放白猫最近收集整理的关于Java-实现双端队列【分析源码】实现双端队列(理解源码)的全部内容,更多相关Java-实现双端队列【分析源码】实现双端队列(理解源码)内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复