-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCola.hpp
152 lines (133 loc) · 3.2 KB
/
Cola.hpp
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
#ifndef AYED_18_TP_3_COLA_HPP
#define AYED_18_TP_3_COLA_HPP
#include "Nodo.hpp"
template <class T> class Cola {
private:
// variables de instancia
Nodo<T>* inicio = nullptr;
Nodo<T>* fin = nullptr;
int tamano = 0;
public:
// funciones
Cola() {};
Cola(T dato) {encolar(dato);};
Cola(Cola<T>* cola);
Nodo<T>* getInicio() {return inicio;};
Nodo<T>* getFin() {return fin;};
int getTamano() {return tamano;};
void encolar(T dato);
T desencolar();
void priorizar(T dato);
bool vacia() {return inicio ? false : true;};
void vaciar() {while(desencolar());};
bool contiene(T dato);
bool eliminar(T dato);
Nodo<T>* enIndex(unsigned index);
};
/* definiciones de las funciones no-inline de la clase */
// Copy-initializer.
template<class T>
Cola<T>::Cola(Cola<T>* cola) {
if(!cola->vacia()) {
Nodo<T>* nodoActual = cola->getInicio();
while(nodoActual) {
encolar(nodoActual->dato);
nodoActual = nodoActual->next;
}
}
}
template<typename T>
void Cola<T>::encolar(T dato) {
if(!vacia()) {
// si no esta vacia
Nodo<T>* nuevoNodo = new Nodo<T>(dato);
fin->next = nuevoNodo;
fin = nuevoNodo;
} else {
// si esta vacia
fin = inicio = new Nodo<T>(dato);
}
tamano++;
}
template<typename T>
T Cola<T>::desencolar() {
// el primer de la fila debe salir
if(!vacia()) {
// copy initialization
T datoADevolver(inicio->dato);
Nodo<T>* nodoABorrar = inicio;
inicio = inicio->next;
if(!inicio) {
fin = nullptr;
}
delete nodoABorrar;
tamano--;
return datoADevolver;
} else {
return nullptr;
}
}
template<class T>
bool Cola<T>::contiene(T dato) {
Nodo<T>* nodoIterado = inicio;
while(nodoIterado) {
if(nodoIterado->dato == dato) {
return true;
}
nodoIterado = nodoIterado->next;
}
return false;
}
// Viola el principio de una cola e ingresa un nuevo dato como prioridad, primero en la cola.
template<class T>
void Cola<T>::priorizar(T dato) {
if(!vacia()) {
// si no esta vacia
Nodo<T>* nuevoNodo = new Nodo<T>(dato);
nuevoNodo->next = inicio;
inicio = nuevoNodo;
} else {
// si esta vacia
fin = inicio = new Nodo<T>(dato);
}
tamano++;
}
/*
* Elimina el primer elemento cuyo dato coincida con el dato pasado como argumento, devuelve true si lo logra, false
* si no encuentra match.
*/
template<class T>
bool Cola<T>::eliminar(T dato) {
Nodo<T>* nodoAnterior = nullptr;
Nodo<T>* nodoIterado = inicio;
while(nodoIterado) {
if(nodoIterado->dato == dato) {
if(nodoAnterior) {
nodoAnterior->next = nodoIterado->next;
} else {
// el *nodoIterado* es el inicial
inicio = nodoIterado->next;
}
delete(nodoIterado);
tamano--;
return true;
}
nodoAnterior = nodoIterado;
nodoIterado = nodoIterado->next;
}
return false;
}
template<class T>
Nodo<T>* Cola<T>::enIndex(unsigned index) {
// si index out of bounds, return nullptr
if(index > (tamano - 1)) return nullptr;
Nodo<T>* nodoIterado = inicio;
for(int i = 0; i < tamano; ++i) {
if(i == index) {
return nodoIterado;
}
nodoIterado = nodoIterado->next;
}
return nullptr;
}
#endif