Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Pilas y ColasCurso: Análisis y Diseño de Algoritmos
Armando Arce Orozco, M.Sc.Escuela de Computación
Agosto 2020
1
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
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
Representación abstracta de pila
4
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
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
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
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
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
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
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
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
Comparación de implementaciones
13
Colas
14
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
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
Representación abstracta de cola
17
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
Representación de cola circular
19
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
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
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
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
Recuperar de la cola
function array_queue.front()if queueSize == 0 then
error 'queue is empty'endreturn array[front]
end
24
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
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
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
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
Comparación de implementaciones
29
Referencia bibliográfica
• Clifford A. Shaffer. Data Structures and Algorithm Analysis inC++, Third Edition, Dover Publications, 2011. Cap. 4
30