-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathArrayQueue.java
More file actions
101 lines (85 loc) · 2.48 KB
/
ArrayQueue.java
File metadata and controls
101 lines (85 loc) · 2.48 KB
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
package queue;
// экземпляр ArrayQueue представим как Q[1..size]
// queue1 = queue2 <=> Q1 = [Q2_1..Q2_size]
// Inv: (∀ i ∈ [1, size] : Q[i] != null) ∧ size >= 0
public class ArrayQueue {
private int start = 0;
private int size = 0;
private static final int START_SIZE = 2;
private Object[] elements = new Object[START_SIZE];
// Pre: size != 0
// Post: Q' = Q ∧ R = Q[1]
public Object element() {
assert size != 0;
return elements[start];
}
// Pre: x != null
// Post: Q' = [Q_1...Q_size, x]
public void enqueue(Object x) {
assert x != null;
ensureCapacity();
size++;
elements[end()] = x;
}
// Pre: size != 0
// Post: Q' = [Q_2...Q_size] ∧ R = Q[1]
public Object dequeue() {
assert size != 0;
Object value = elements[start];
elements[start] = null;
start = (start + 1) % elements.length;
size--;
return value;
}
// Pre: size != 0
// Post: Q' = [Q_1...Q_(size-1)] ∧ R = Q_size
public Object remove() {
assert size != 0;
Object value = elements[end()];
elements[end()] = null;
size--;
return value;
}
// Pre: x != null
// Post: Q' = [x, Q_1...Q_size]
public void push(Object x) {
assert x != null;
ensureCapacity();
size++;
start = (start - 1 + elements.length) % elements.length;
elements[start] = x;
}
// Pre: size != 0
// Post: Q' = Q ∧ R = Q_(size-1)
public Object peek() {
return elements[end()];
}
// Post : R = size ∧ Q' = Q
public int size() {
return size;
}
// Post : R = (size == 0) ∧ Q' = Q
public boolean isEmpty() {
return size == 0;
}
// Post: R = (start + size - 1) % elements.length ∧ Q' = Q
private int end() {
return (start + size - 1) % elements.length;
}
// Post: elements'.length > capacity ∧ Q' = Q
private void ensureCapacity() {
if (size >= elements.length) {
Object[] newElements = new Object[size * 2];
System.arraycopy(elements, start, newElements, 0, size - start);
System.arraycopy(elements, 0, newElements, size - start, end() + 1);
elements = newElements;
start = 0;
}
}
// Post: size' = 0
public void clear() {
elements = new Object[START_SIZE];
start = 0;
size = 0;
}
}