Heaps

You might also like

You are on page 1of 2

#Cola de Prioridad Descendente Esttica Circular

class Heaps:
def __init__(self,f_prioridad,MAX=100):
self.__elems = [None]*MAX
self.__huecos = [] #Guarda posiciones.
self.__fprioridad = f_prioridad #Devuelve un nmero.
self.__head = 0
self.__end = 0
self.__nelems = 0
self.__lenght = MAX
def __len__(self):
return self.__nelems
def isEmpty(self):
return self.__nelems == 0
def isFull(self):
return self.__nelems == self.__lenght
def enqueue(self,elem):
assert not self.isFull(), "Error en enqueue(): cola llena"
if self.isEmpty():
self.__head = 0
self.__elems[self.__head] = elem
else:
if len(self.__huecos)+self.__nelems < self.__lenght:
self.__end = (self.__end+1)%self.__lenght
else: #Compactacin!
n = 0
for i in range(len(self.__elems)):
x = (self.__head+i)%self.__lenght
if x in self.__huecos:
n += 1
else:
if n != 0:
self.__elems[(x-n)%self.
__lenght] = self.__elems[x]
self.__huecos = []
self.__end = (self.__end-n+1)%self.__lenght
self.__elems[self.__end] = elem
self.__nelems += 1
def dequeue(self): #No se eliminan los elementos aqu.
assert not self.isEmpty(), "Error en dequeue(): cola vaca"
x = self.__head
y = 0
while ((self.__head+y)%self.__lenght) != self.__end:
y += 1
posicion = (self.__head+y)%self.__lenght
if posicion not in self.__huecos and self.__fprioridad(s
elf.__elems[posicion]) > self.__fprioridad(self.__elems[x]):
x = (self.__head+y)%self.__lenght
self.__huecos.sort()
if x == self.__head:
if len(self.__huecos) == 0:
self.__head = (self.__head+1)%self.__lenght
elif self.__huecos[-1] < self.__head:
self.__head = (self.__head+1)%self.__lenght
else:
for i in range(len(self.__huecos)):
if self.__huecos[i] > self.__head:
j = 1
while (self.__huecos[i]+j)%self.
__lenght in self.__huecos:
j += 1
self.__head = (self.__huecos[i]+
j)%self.__lenght
break
elif x == self.__end:
i = 0
while (self.__end-(i+1))%self.__lenght in self.__huecos:
i += 1
self.__end = (self.__end-(i+1))%self.__lenght
self.__nelems -= 1
self.__huecos.append(x)
return self.__elems[x]

You might also like