-
Notifications
You must be signed in to change notification settings - Fork 0
/
PriorityQueue.java
108 lines (76 loc) · 2.83 KB
/
PriorityQueue.java
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
public class PriorityQueue<T> {
// * Atributos
private T[] elements;
private int size;
// * Construtores
public PriorityQueue(int capacity) {
this.elements = (T[]) new Object[capacity];
this.size = 0;
}
public PriorityQueue() {
this(10);
}
// * Métodos de Controle Interno
//Verifica se o índice é válido
private void checkIndex(int index) {
if (index < 0 || index > this.size) throw new IllegalArgumentException("Posição Inválida");
}
//Aumenta a capacidade do array interno dessa instância List, se necessário, dinamicamente
private void ensureCapacity() {
if (this.size == this.elements.length) {
T[] newElements = (T[]) new Object[this.size * 2];
for (int i = 0; i < this.size; i++) newElements[i] = this.elements[i];
this.elements = newElements;
}
}
// * Métodos de Inserção
/* Insere o elemento especificado nesta fila de prioridade, de acordo com o critério Comparable
do objeto do tipo da Fila. */
public void enqueue(T element) {
Comparable<T> key = (Comparable<T>) element;
int index;
for (index = 0; index < this.size; index++) {
if (key.compareTo(this.elements[index]) < 0) break;
}
this.checkIndex(index);
this.ensureCapacity();
for (int i = this.size; i > index; i--) this.elements[i] = this.elements[i - 1];
this.elements[index] = element;
this.size++;
}
// * Métodos de Consulta
//Retorna o número de elementos nesta lista.
public int size() {
return this.size;
}
//Retorna verdadeiro se esta lista não contiver elementos.
public boolean isEmpty() {
return this.size == 0;
}
//Recupera, mas não remove, o cabeçalho desta fila ou retorna nullse esta fila estiver vazia.
public T peek() {
if (this.isEmpty()) return null;
return this.elements[0];
}
//Retorna uma representação string do objeto
public String toString() {
StringBuilder priorityQueue = new StringBuilder();
priorityQueue.append("[");
for (int i = 0; i < this.size - 1; i++) {
priorityQueue.append(this.elements[i]);
priorityQueue.append(", ");
}
if (this.size > 0) priorityQueue.append(this.elements[this.size - 1]);
priorityQueue.append("]");
return priorityQueue.toString();
}
// * Métodos de Remoção
//Recupera e remove o cabeçalho desta fila ou retorna null, se esta fila estiver vazia.
public T dequeue() {
if (this.isEmpty()) return null;
T firstElement = this.elements[0];
for (int i = 0; i < this.size - 1; i++) this.elements[i] = this.elements[i + 1];
this.size--;
return firstElement;
}
}