Вы находитесь на странице: 1из 24

Lenguaje de Programacin Estructurado

TIPOS DE DATOS ABSTRACTOS:


PILAS Y COLAS

21/11/2015 1
Qu es una Pila?
Tambin conocida como Stack, es un tipo de datos
abstracto que acta como coleccin de elementos y
soporta las siguientes operaciones:

- Apilar (push): Agregar un elemento a la coleccin


(pila)

- Tope (top): Obtener el ltimo elemento agregado

- Desapilar (pop): Remover el ltimo elemento


agregado

Adicionalmente es posible considerar las siguientes


operaciones:

- Vaco (empty): Indicar si la coleccin esta vaca

21/11/2015 - Tamao (size): Indicar la cantidad de elementos de 2


Qu es una Cola?
Tambin conocida como Queue, es un tipo de datos
abstracto que acta como coleccin de elementos y
soporta las siguientes operaciones:

- Encolar (enqueue): Agregar un elemento a la


coleccin (cola)

- Frente (front): Obtener el primer elemento de la


cola

- Desencolar (dequeue): Remover el primer


elemento de la cola

Adicionalmente es posible considerar las siguientes


operaciones:

- Vaco (empty): Indicar si la coleccin esta vaca


21/11/2015 3
Pila vs Cola

Pila LIFO: Last-in, First-out (ltimo en entrar,


primero en salir)

Cola FIFO: First-in, First-out (primero en entrar,


primero en salir)

21/11/2015 4
Implementacin de Pila: Usando arreglos

Pila basada en Se mantiene una variable, size, que indica el


arreglo tamao de la pila y al mismo tiempo la posicin
en la que se agregar el prximo elemento.

Apilar (push):
v = v0 v1
- Guardar el nuevo elemento en la posicin size
- Incrementar variable de tamao size: size =
0 1 2
size + 1

size Tope (top):


- Retornar el elemento en la posicin size - 1

Desapilar (pop):
- Reducir variable de tamao size: size = size -
1

21/11/2015 5
Implementacin de Pila: Usando arreglos
#include <iostream>

using namespace std;

#define MAX_SIZE 1000

struct Stack {
int v[MAX_SIZE];
int size; v = v0 v1

Stack() { int main() {


size = 0; Stack pila;
0 1 2
}
bool empty() { if(pila.empty()) {
return size == 0; cout<<"Pila vacia"<<endl; size
} }
int top() {
return v[size - 1]; pila.push(5);
} pila.push(4); Desventaja: El tamao mximo
void push(int value) { cout<<pila.top()<<endl; // 4
v[size] = value;
se ve limitado por el tamao del
size++; pila.pop(); arreglo utilizado
} cout<<pila.top()<<endl; // 5
void pop() {
size--; return 0;
} }
};

21/11/2015 6
Implementacin de Cola: Usando arreglos
Se mantienen dos variables: front, que indica el
ndice del primer elemento de la cola (ms
Cola basada en antiguo), y back, que indica la posicin en la que
arreglo se agregar el prximo elemento.

Inicialmente front = 0 y back = 0


v= v2 v3
Encolar (enqueue):
0 1 2 3 4 - Guardar el nuevo elemento en la posicin back
- Incrementar variable back: back = back + 1

front back Frente (front):


- Retornar el elemento en la posicin front

Desencolar (dequeue):
- Incrementar la variable front: front = front +
1

21/11/2015 Tamao (size): 7


Implementacin de Cola: Usando arreglos
#include <iostream>
using namespace std;

#define MAX_SIZE 1000

struct Queue {
int v[MAX_SIZE];
int _front, _back;
Queue() {
v= v2 v3
_front = 0;
_back = 0; 0 1 2 3 4
} int main() {
bool empty() { Queue cola;
int size = _back - _front;
return size == 0; if(cola.empty()) { front back
} cout<<"Cola vacia"<<endl;
int front() { }
return v[_front];
} cola.enqueue(5); Desventaja: El tamao mximo
void enqueue(int value) { cola.enqueue(4); se ve limitado por el tamao del
v[_back] = value; cout<<cola.front()<<endl; //
_back++; 5 arreglo utilizado
}
void dequeue() { cola.dequeue();
_front++; cout<<cola.front()<<endl; //
} 4
};
return 0;
21/11/2015 } 8
Lenguaje de Programacin Estructurado
TIPOS DE DATOS ABSTRACTOS: PILAS Y
COLAS BASADAS EN LISTAS ENLAZADAS

21/11/2015 9
Implementacin de Pila: Usando lista enlazada

Pila basada en lista

Se hace uso de 2 estructuras:


3 19
<<nodo>> - Pila (Stack): Contiene la cantidad de elementos
<<pila>> y un puntero al nodo tope de la pila.

Cantidad Puntero a - Nodo (Node): Contiene el valor o valores propios


de nodo del nodo y un puntero al nodo siguiente.
elemento 99 siguiente
s <<nodo>> Apilar: Insertar un nuevo nodo en el tope
Puntero a
nodo Tope: Retornar el elemento del nodo tope
tope
47 Desapilar: Remover el nodo tope y actualizar
<<nodo>> puntero de la pila hacia el nodo siguiente
Puntero
nulo
21/11/2015 10
Implementacin de Pila: Usando lista enlazada
Pila basada en lista

Constructo
Apilar(push
r:
):
<<pila>>
2 _top 54 Node* nodo = new Node();
size=0 Puntero nodo->value = 54;
nulo nodo->next = _top;
<<pila>>
_top = nodo;
size++;
Tope(top): 19

1 _top 19
<<nodo>>
<<pila>>

return _top->value;

21/11/2015 11
Implementacin de Pila: Usando lista enlazada
Pila basada en lista

Apilar(push
Desapilar(p
):
op):
2 _top 54 top 54 Node* top = _top;
1 _top _top = _top->next;
<<pila>> delete(top);
<<pila>>

19
19

21/11/2015 12
Implementacin de Pila: Usando lista enlazada
#include <iostream> struct Stack {
Node* _top;
using namespace std; int size;
Stack() {
struct Node { _top = NULL;
int value; size = 0;
Node* next; }
}; bool empty() {
return size == 0;
}
int top() {
return _top->value;
}
int main() {
void push(int value) {
Stack pila;
Node* nodo = new Node();
nodo->value = value;
if(pila.empty()) {
nodo->next = _top;
cout<<"Pila vacia"<<endl;
_top = nodo;
}
size++;
}
pila.push(5);
void pop() {
pila.push(4);
Node* top = _top;
cout<<pila.top()<<endl; // 4
if(size > 0) {
_top = _top->next;
pila.pop();
delete(top);
cout<<pila.top()<<endl; // 5
size--;
}
return 0;
}
21/11/2015 } 13
};
Ejemplo 1: Convertir de base 10 a base 2
19 =9*2+
1 Algoritmo:
9 =4*2+
1 1. Mientras n > 0
4 =2*2+ 1. digitos.push(n mod 2)
0 2. n = n / 2
2 =1*2+ 2. Mientras pila.empty() ==
0 false
1 =0*2+ 1. imprimir(pila.top())
1 2. pila.pop()

19 = 100112

21/11/2015 14
Ejemplo 2: Notacin Polaca Inversa
Inventada en 1954 para evaluar expresiones de manera rpida
minimizando el uso de memoria del computador. Implementada en
mltiples calculadoras de la poca. No requiere el uso de parntesis.

54+ 9
54+3* 27
54+32** 54 Equivalente a (5 + 4) * (3 * 2)

Algoritmo:

1. Mientras hay tokens en el input


1. Leer token
2. Si el token es un numero
1. Agregarlo a la pila
3. En caso contrario, si es un operador
21/11/2015 15
Ejemplo 2: Notacin Polaca Inversa
Algoritmo:

1. Mientras hay tokens en el input


1. Leer token
2. Si el token es un numero
1. Agregarlo a la pila
3. En caso contrario, el token es un operador
1. Se sabe que el operador necesita n operandos
2. Si hay menos de n valores en la pila
1. (Error) El usuario no ha ingresado
suficientes valores
3. En caso contrario, extraer n valores de la pila
4. Evaluar el operador con los n operandos
5. Agregar el resultado a la pila
2. Si solo queda un valor en la pila
1. Ese valor es el resultado de la expresin
3. En caso contrario, si hay mas valores en la pila
1. (Error) El usuario ha ingresado demasiados
21/11/2015 valores 16
Ejemplo 2: Notacin Polaca Inversa

21/11/2015 17
Implementacin de Cola: Usando lista enlazada
Cola basada en lista

Se hace uso de 2 estructuras:


3 19
<<nodo>> - Cola (Queue): Contiene la cantidad de
<<cola>> elementos, un puntero al nodo frente (primer
nodo), y un puntero al ultimo nodo de la cola.
Puntero a
Cantidad
nodo - Nodo (Node): Contiene el valor o valores propios
de
siguiente del nodo y un puntero al nodo siguiente.
elemento 99
s <<nodo>>
Puntero a Encolar (enqueue) : Insertar un nuevo nodo al
nodo final de la cola
frente
Puntero a
47 Frente (front): Retornar el nodo del frente
ltimo <<nodo>> (primer nodo)
nodo
Puntero
nulo Desencolar (dequeue): Remover el nodo del
21/11/2015 frente y actualizar puntero de la cola hacia el 18
nodo
siguiente
Lenguaje de Programacin Estructurado
TIPOS DE DATOS ABSTRACTOS:
ARREGLOS DINMICOS

21/11/2015 19
Arreglos Dinmicos
Podemos crear arreglos cuyo numero de elementos
no sea constante?
0
S, utilizando gestin dinmica de memoria! (dynamic
get(1) memory allocation)
1
Podemos crear una estructura con las siguientes
2
operaciones:
3
- Agregar (.add(x)): Agregar un elemento al final de la
add(x) x estructura

- Obtener i-simo elemento (.get(i))

- Tamao (.size()): Indicar la cantidad de elementos

21/11/2015 20
Operador new[]
Reservar un bloque de memoria

El operador n ew [], usado del modo n ew tip o[n ], reserva un bloque de memoria con
espacio para n elementos de determinado tip o de datos. Retorna un puntero hacia el
primer elemento del bloque.

in t* ptr1 = n ew in t[n]; // El puntero ptr1 apunta a un bloque de n


enteros
Alum no* ptr2 = n ew Alum no[n]; // El puntero ptr2 apunta a un bloque de n
Alumnos

Acceder a un elemento del bloque de memoria

Podemos acceder a los elementos usando aritmtica de punteros:

*(ptr1 + 5) = 1234; // Asignando el valor 1234 al elemento 5


cout << *(ptr1 + 5) << endl; // Obteniendo el valor del elemento 5

Adicionalmente, podemos acceder al bloque como si se tratara de un arreglo:


21/11/2015 21
ptr1[0] = 4321; // Asignando el valor 4321 al elemento 0
Arreglo Dinmico

1. 2. Agregar
Constructo elemento:
r: ptr ptr

Usando new[], 12 Si el nmero actual


size = 0 0
crear un bloque 3 de elementos es
inicial con cierta menor a la
1 capacidad pero size = 1
capacidad,
sin ningn valor almacenar el nuevo
2 almacenado 2 elemento en la
siguiente posicin
3 3
disponible del
bloque.
capacity = 4 capacity = 4
En caso contrario,
es necesario
incrementar la
capacidad!

21/11/2015 22
Arreglo Dinmico
3.3. Eliminamos el
bloque antiguo y
3. Incrementar
actualizamos
capacidad:
referencias ptr
ptr ptrNuevo ptr ptrNuevo

12 12 12 12 0 12
0
3 3 3 3 3
1 37 37 37 37 1 37

2 56 56 56 56 2 56

3 99 99 99 99 3 99

size = capacity = 4 size = 4

3.1. Creamos un 3.2. Copiamos


nuevo bloque con todos los
el doble de valores hacia el
capacidad nuevo bloque
21/11/2015 23
capacity = 8
Operador delete[]
Liberar un bloque de memoria

El operador d elete[], usado del modo d elete[] p tr, libera el bloque de memoria
apuntado por el puntero p tr. La memoria liberada, ya no debe ser utilizada por el
puntero, puesto que puede ser utilizada por otra variable o programa.

in t* ptr1 = n ew in t[n];
d elete[] ptr1; // Liberar la memoria del bloque de n enteros

Alum no* ptr2 = n ew Alum no[n];


d elete[] ptr2; // Liberar la memoria del bloque de n Alumnos

21/11/2015 24

Вам также может понравиться