-
Notifications
You must be signed in to change notification settings - Fork 3
/
Cola.h
133 lines (96 loc) · 2.63 KB
/
Cola.h
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
#ifndef COLA_H_
#define COLA_H_
#include <string>
#include "Nodo.h"
/*
* Una Cola es una estructura dinámica de datos organizada de acuerdo al
* principio FIFO (First In - First Out).
*
* El primer elemento en entrar es el primer elemento en salir.
*
* Sólo permite el acceso al elemento que denomina frente.
*
*/
template<class T> class Cola {
private:
Nodo<T>* frente;
Nodo<T>* fondo;
public:
/*
* post: instancia de Cola vacía y lista para ser usada.
*/
Cola();
/*
* post: devuelve si la Cola no tiene ningún elemento.
*/
bool estaVacia();
/*
* post: agrega 'elemento' en el fondo de la Cola.
*/
void acolar(T elemento);
/*
* pre : la Cola no está vacía.
* post: remueve el frente de la Cola y lo devuelve.
*/
T desacolar();
/*
* pre : la Cola no está vacía.
* post: devuelve el frente de la Cola.
*/
T obtenerFrente();
/*
* post: remueve todos los elementos y libera
* los recursos tomados por la estructura de datos.
*/
~Cola();
};
template<class T>
Cola<T>::Cola() {
this->frente = NULL;
this->fondo = NULL;
}
template<class T>
bool Cola<T>::estaVacia() {
return (this->frente == NULL);
}
template<class T>
void Cola<T>::acolar(T elemento) {
Nodo<T>* nuevoFondo = new Nodo<T>(elemento);
if (this->estaVacia()) {
this->frente = nuevoFondo;
} else {
this->fondo->cambiarSiguiente(nuevoFondo);
}
this->fondo = nuevoFondo;
}
template<class T>
T Cola<T>::desacolar() {
if (this->estaVacia()) {
throw std::string("No se puede desacolar, la cola está vacía.");
}
/* remueve el frente de la estructura */
Nodo<T>* frenteAnterior = this->frente;
this->frente = frenteAnterior->obtenerSiguiente();
if (this->frente == NULL) {
this->fondo = NULL;
}
/* devuelve el elemento y libera los recursos asociados */
T elemento = frenteAnterior->obtenerDato();
delete frenteAnterior;
return elemento;
}
template<class T>
T Cola<T>::obtenerFrente() {
if (this->estaVacia()) {
throw std::string("No se puede obtener el frente, la cola está vacía.");
}
T elemento = this->frente->obtenerDato();
return elemento;
}
template<class T>
Cola<T>::~Cola() {
while (! this->estaVacia()) {
this->desacolar();
}
}
#endif /* COLA_H_ */