30
Pilas y Colas Curso: Análisis y Diseño de Algoritmos Armando Arce Orozco, M.Sc. Escuela de Computación Agosto 2020 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

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Referencia bibliográfica

• Clifford A. Shaffer. Data Structures and Algorithm Analysis inC++, Third Edition, Dover Publications, 2011. Cap. 4

30