2. Pilas
Una pila es una estructura de datos lineal
que brinda acceso sólo al último elemento
agregado.
En una pila, los elementos sólo pueden
ser agregados y eliminados del final de
una secuencia.
Esto lleva a la política de inserción y
eliminación de elementos conocida como
quot;Último en Entrar, Primero en Salirquot;.
Mtl Lourdes Cahuich 2
3. Pilas
Dicho de otra forma, el siguiente elemento
que puede ser eliminado de una pila es
siempre el elemento que fue agregado
más recientemente en la pila.
Siempre podemos agregar más elementos
a la pila, pero cada vez que lo hacemos, el
elemento agregado más recientemente se
convierte en el elemento que puede ser
eliminado primero.
Mtl Lourdes Cahuich 3
5. Pilas
Con este modelo en mente, pasemos a
añadir unos cuantos elementos a una pila
que inicialmente se encuentra vacía.
Primero añadimos (generalmente se le
conoce como quot;empujarquot; (pushing) a la fila
un elemento con el valor de 1.
Mtl Lourdes Cahuich 5
7. Pilas
El elemento sombreado en gris está ahora
en la parte más alta de la pila.
Al añadir el segundo elemento se esconde
el primer elemento debido a que el
segundo elemento es ahora el único
elemento que puede ser eliminado.
Además, es el único elemento de la pila a
cuyo valor podemos acceder.
Mtl Lourdes Cahuich 7
8. Pilas
Esta es una propiedad importante de la
estructura de datos de pilas que difiere de
los vectores y los deques.
En una pila, tenemos acceso al número de
elementos almacenados en la estructura
de datos, pero no tenemos acceso a todos
los valores de los elementos
Mtl Lourdes Cahuich 8
9. Pilas
Si fuéramos a eliminar un elemento de la pila
(por lo general se le conoce como quot;poppingquot;),
nuestra pila se vería como en la figura de
enmedio
Hemos examinado cómo operan las pilas y
hemos visto las operaciones principales
asociadas con las pilas.
En resumen, quot;empujandoquot; o quot;pushingquot; agrega
un elemento en la parte más alta de la pila, y
quot;poppingquot; elimina el elemento que se encuentra
más arriba de la fila.
Mtl Lourdes Cahuich 9
10. Aplicaciones de Pilas
Las pilas son una estructura importante en
la Ciencia Computacional, y tienen
muchas aplicaciones diferentes.
Estas aplicaciones varían de tareas
sencillas como invertir los caracteres en
una cadena, a tareas más complejas
como la evaluación de expresiones
aritméticas o la navegación de laberintos.
Mtl Lourdes Cahuich 10
11. Aplicaciones de Pilas
Es importante tener un entendimiento
sólido del concepto de una pila, debido a
que más adelante encontraremos muchos
usos de pilas en el contexto de otras
estructuras de datos y algoritmos.
Mtl Lourdes Cahuich 11
12. Cómo Usar el Adaptador stack de
STL
El adaptador stack de STL ofrece una
interfaz adecuada para ser usada como
una pila.
A continuación muestra todas las
funciones miembro del adaptador stack
Mtl Lourdes Cahuich 12
13. #include <iostream>
#include <string>
#include <cstdlib>
#include <stack>
using namespace std;
int main(int argc, char* argv[]) {
stack<int> s;
// push and pop
s.push(1);
s.pop();
// top
s.push(10);
s.push(11);
cout << s.top() << endl;
// size and empty
cout << s.size() << endl;
cout << s.empty() << endl;
return EXIT_SUCCESS;
}
Mtl Lourdes Cahuich 13
14. Adaptador stack
Solamente existen seis funciones
miembro en la interfaz del adaptador
stack.
Los métodos push y pop insertan y
eliminan elementos de una pila,
respectivamente, y el método top regresa
una referencia a los datos almacenados
arriba de la pila.
Mtl Lourdes Cahuich 14
15. Adaptador stack
Al igual que el adaptador queue, el
método size regresa el número de
elementos almacenados en una pila y el
método empty despliega true si una fila
está vacía y false si la pila no está
vacía.
Para usar el adaptador stack de STL en
un programa, un programador debe incluir
la biblioteca <stack>.
Mtl Lourdes Cahuich 15
16. Adaptador stack
Este listado despliega las líneas de un
archivo texto en orden inverso.
Una pila provee una estructura de datos
natural para resolver este problema.
Mtl Lourdes Cahuich 16
17. // open file specified by command-line argument
ifstream inf(argv[1]);
if ( !inf ) {
cerr << quot;cannot open quot; << filename << quot; for inputquot; <<
endl;
return EXIT_FAILURE;
}
stack<string> s;
string line;
// read file line by line
while (getline(inf, line)) {
s.push(line);
}
inf.close();
// print lines in reverse
while (!s.empty()) {
cout << s.top() << endl;
s.pop();
}
Mtl Lourdes Cahuich 17