Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto)...
Transcript of Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto)...
![Page 1: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/1.jpg)
Pilas y ColasCurso: Análisis y Diseño de Algoritmos
Armando Arce Orozco, M.Sc.Escuela de Computación
Agosto 2020
1
![Page 2: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/2.jpg)
Introducción
Una pila (STACK) es como una estructura de lista en la que loselementos puede ser insertados o removidos solo desde unextremo.
• Aunque esta restricción hace que las pilas sean menosflexibles que las listas, las convierte en estructuras máseficientes y fáciles de implementar.
• Muchas aplicaciones requieren solo una forma limitada deoperaciones de inserción y borrado tal como proveen laspilas.
2
![Page 3: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/3.jpg)
Pila como TDA (tipo de datos abstracto)
stack.clear() # Limpia (borra toda) la pilastack.push(x) # Agrega x a la pilastack.pop() # Elimina el tope de la pilastack.top() # Recupera el tope de la pilastack.size() # Retorna el tamaño de la pilastack.empty() # Indica si la pila está vacía
3
![Page 4: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/4.jpg)
Representación abstracta de pila
4
![Page 5: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/5.jpg)
Pilas basadas en arreglos
La implementación de pila basado en arreglo es esencialmenteuna versión simplificada de la lista basada en arreglo.
• El único aspecto importante a tomar en cuenta es que elfinal del arreglo debe representar el tope de la pila.
• En este caso, el costo de cada operación de POP y PUSHes O(1).
5
![Page 6: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/6.jpg)
Definición de la pila
function array_stack(mxSz)local maxSize = mxSzlocal top = 0local array = mem_alloc(maxSize)
end
function array_stack.size()return top
end
function array_stack.empty()return (top==0)
end6
![Page 7: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/7.jpg)
Agregar en la pila
function array_stack.push(x)if (top >=maxSize) then
array = resize(array,maxSize*2)maxSize = maxSize * 2
endarray[top] = xtop = top + 1
end
7
![Page 8: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/8.jpg)
Consultar y eliminar en la pila
function array_stack.pop()if (top == 0) then
error "stack is empty"endtop = top - 1return array[top]
end
function array_stack.top()if (top == 0) then
error "stack is empty"endreturn array[top-1]
end 8
![Page 9: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/9.jpg)
Pilas basadas en enlaces
La implementación de la pila enlazada es bastante simple.
• Los elementos se insertan y eliminan solo del encabezadode la lista.
• No se utiliza un nodo de encabezado porque no se requiereningún código de caso especial para las listas de cero o unelementos.
• El único enlace es el tope, un puntero al primer nodo deenlace (tope) de la pila.
9
![Page 10: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/10.jpg)
Definición de pila basada en enlaces
function linked_stack()local top = node(nil,nil)local stackSize = 0
end
function linked_stack.size()return stackSize
end
function linked_stack.empty()return (stackSize==0)
end
10
![Page 11: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/11.jpg)
Agregar y recuperar en pila enlazada
function linked_stack.push(x)top = node(x,top)stackSize = stackSize + 1
end
function linked_stack.top()if (top == null) then
error "stack is empty"endreturn top.data
end
11
![Page 12: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/12.jpg)
Borrar en pila enlazada
function linked_stack.pop()if (top == null) then
error "stack is empty"endtemp = top.datatop = top.linkstackSize = stackSize - 1return temp
end
12
![Page 13: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/13.jpg)
Comparación de implementaciones
13
![Page 14: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/14.jpg)
Colas
14
![Page 15: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/15.jpg)
Colas
Al igual que la pila, la cola (QUEUE) es una estructura similara una lista que proporciona acceso restringido a sus elementos.
• Los elementos de la cola solo pueden insertarse en la parteposterior (llamada operación de puesta en cola -ENQUEUE) y eliminarse de la parte delantera (llamadaoperación de salida de cola DEQUEUE).
15
![Page 16: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/16.jpg)
Cola como TDA (Tipo de datos abstracto)
queue.clear() # Limpia (borra toda) la colaqueue.enqueue(x) # Agrega x al final de la colaqueue.dequeue() # Elimina el frente de la colaqueue.front() # Recupera el frente de la colaqueue.size() # Retorna el tamaño de la colaqueue.empty() # Indica si la cola está vacía
16
![Page 17: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/17.jpg)
Representación abstracta de cola
17
![Page 18: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/18.jpg)
Colas basadas en arreglos
La cola basada en arreglos es algo difícil de implementar demanera efectiva.
• Una simple conversión de la implementación de la listabasada en arreglos no es eficiente.
• El problema se puede resolver simulando que el arreglo escircular y, por lo tanto, permite que la cola continúedirectamente desde la posición de mayor número en elarreglo hasta la posición de menor número.
18
![Page 19: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/19.jpg)
Representación de cola circular
19
![Page 20: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/20.jpg)
Implementación de colas
function array_queue(mxSz)local maxSize = mxSzlocal front = 0local rear = 1local queueSize = 0local array = mem_alloc(maxSize)
end
function array_queue.size()return queueSize
end
20
![Page 21: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/21.jpg)
Agregar a la cola
function array_queue.enqueue(x)if (queueSize >= maxSize) then
temp = resize(null,maxSize)for i = 0,maxSize-1 do
temp[i] = array[(front + i) % maxSize];endarray = tempmaxSize = maxSize * 2front = 0; rear = queueSize
endrear = (rear+1) % maxSizearray[rear] = xqueueSize = queueSize + 1
end 21
![Page 22: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/22.jpg)
Reasignación de posiciones
rear front| 34 | 25 | 45 | 89 | 10 |
0 1 2 3 4
front front| 89 | 10 | 34 | 25 | 45 | | | | | |
0 1 2 3 4 5 6 7 8 9
22
![Page 23: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/23.jpg)
Eliminar de la cola
function array_queue.dequeue()if queueSize == 0 then
error 'queue is empty'endtemp = array[front]front = (front+1) % maxSizequeueSize = queueSize - 1return temp
end
23
![Page 24: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/24.jpg)
Recuperar de la cola
function array_queue.front()if queueSize == 0 then
error 'queue is empty'endreturn array[front]
end
24
![Page 25: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/25.jpg)
Colas enlazadas
La implementación de la cola enlazada es una adaptacióndirecta de la lista enlazada.
• Las funciones front y rear son punteros a los elementosfrente y cola de la cola, respectivamente.
• Se utiliza un nodo de enlace de encabezado (centinela),que permite una implementación más sencilla de laoperación de agregar a la cola al evitar cualquier casoespecial cuando la cola está vacía.
25
![Page 26: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/26.jpg)
Declaración de cola enlazada
function linked_queue(n)front = rear = node(null,null)queueSize = 0
end
function linked_queue(.size()return queueSize
end
function linked_queue(.empty()return (queueSize==0)
end
26
![Page 27: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/27.jpg)
Agregar y consultar en la cola
function linked_queue(.enqueue(x)rear.next = node(x,null)rear = rear.linkqueueSize = queueSize + 1
end
function linked_queue.front()if queueSize == 0
error 'queue is empty'endreturn front.link.data
end
27
![Page 28: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/28.jpg)
Eliminar de la cola
function linked_queue.dequeue()if queueSize == 0 then
error 'queue is empty'endlocal temp = front.link.datafront.link = front.link.linkif rear == front.link then
rear = frontendqueueSize = queueSize - 1return temp
end
28
![Page 29: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/29.jpg)
Comparación de implementaciones
29
![Page 30: Pilas y Colas - Curso: Análisis y Diseño de Algoritmos · ColacomoTDA(Tipodedatosabstracto) queue.clear()#Limpia(borra toda)la cola queue.enqueue(x)#Agrega x al final de la cola](https://reader034.fdocuments.co/reader034/viewer/2022052106/604126cf069e2435a679fcc8/html5/thumbnails/30.jpg)
Referencia bibliográfica
• Clifford A. Shaffer. Data Structures and Algorithm Analysis inC++, Third Edition, Dover Publications, 2011. Cap. 4
30