📜  python将数组转换为链表 - Python代码示例

📅  最后修改于: 2022-03-11 14:47:20.339000             🧑  作者: Mango

代码示例2
class MaxPriority():
    def __init__(self):
        self.heap = []
        self.tempNumber = []
        self.tempWord = []
        self.counter = int(0)
        self.maxsize = int(0)
        self.size = int(0)

    def root(self,index):
        if index == 0:
            return True
        return False
    
    def leaf(self,index):
        if index >= self.size//2 and index <= self.size:
            return True
        return False

    def getParent(self, index):
        if self.root(index):
            return None
        return (index-1)//2

    def leftChild(self,index):
        if self.leaf(index):
            return None
        return (index*2)+1

    def rightChild(self,index):
        if self.leaf(index):
            return None
        elif (index*2)+2 >= self.size:
                return None
        return (index*2)+2

    def swap(self,src,dest):
        self.heap[src], self.heap[dest] = self.heap[dest], self.heap[src]

    def heapifyUp(self):
        temp = self.size-1
        if self.size>1:
            while(self.heap[self.getParent(temp)] < self.heap[temp]):
                self.swap(temp,self.getParent(temp))
                temp = self.getParent(temp)
                if self.getParent(temp) == None:
                    break

    def heapifyDown(self):
        temp = 0
        if self.size == 2:
            if self.rightChild(temp) != None:
                if self.heap[self.leftChild(temp)] > self.heap[self.rightChild(temp)]:
                    self.swap(temp,self.leftChild(temp))
                    temp = self.leftChild(temp)
                else:
                    self.swap(temp,self.rightChild(temp))
                    temp = self.rightChild(temp)
            else:
                if self.heap[self.leftChild(temp)] > self.heap[temp]:
                    self.swap(temp,self.leftChild(temp))
        elif self.size>=3:
            while(self.heap[temp] < self.heap[self.leftChild(temp)] or self.heap[temp] < self.heap[self.rightChild(temp)]):
                if self.heap[self.leftChild(temp)] > self.heap[self.rightChild(temp)]:
                    self.swap(temp,self.leftChild(temp))
                    temp = self.leftChild(temp)
                else:
                    self.swap(temp,self.rightChild(temp))
                    temp = self.rightChild(temp)
                if self.leftChild(temp) == None or self.rightChild(temp) == None:
                    break
    
    def add(self,word,number):
        self.tempWord.append(word)
        self.tempNumber.append(number)
        self.size+=1
        if self.size > self.maxsize:
            self.heap.append(number)
            self.maxsize+=1
        else:
            self.heap[self.size-1] = number
        self.heapifyUp()

    def delete(self):
        self.heap[0] = self.heap[self.size-1]
        self.size-=1
        self.heapifyDown()

    def selesaikan(self):
        if self.size == 0:
            print("Priority is empty !!")
        elif self.size == 1:
            print("Only one priority !!")
        else:
            self.counter=self.size
            print("\n== URUTAN PRIORITAS TUGAS TOTO BERDASARKAN MAX HEAP ==")
            for x in range (0,self.size):
                for i in range(0,1):
                    for j in range(0,self.counter):
                        if(str(self.heap[i]) == str(self.tempNumber[j])):
                            print("-> Prioritas " + str(x+1) + " = " + str(self.tempWord[j]))
                self.delete()

    def peek(self):
        if self.size>0:
            return self.heap[0]
        return None

tugas = MaxPriority()
print("\n== MEMPRORITASKAN TUGAS TOTO BERDASARKAN MAX HEAP ==")
n_data = int(input("-> Masukkan banyak data yang akan disusun : "))

for i in range (0,n_data):
    name= input("\n1) Nama tugas : ")
    priorityy = int(input("2) Prioritas : "))
    print("-> Data berhasil disimpan!!")
    tugas.add(name,priorityy)

tugas.selesaikan()