队列类(分别用列表和链表实现)

#!/usr/bin/python3

class QueueUnderflow(ValueError):
    pass


class ListQueue():  #列表实现循环队列类
    def __init__(self, len_=8):
        self.__len = len_
        self.__elems = [0] * len_ #默认每个元素都是0
        self.__head = 0 #队头元素下标
        self.__num = 0  #实际元素个数
        
    def __len__(self):
        return self.__num

    def is_empty(self):
        return self.__num == 0

    def peek(self):
        if self.__num == 0:
            raise QueueUnderflow("元素个数为0")
        return self.__elems[self.__head]

    def dequeue(self):
        if self.__num == 0:
            raise QueueUnderflow("元素个数为0")
        elem = self.__elems[self.__head]
        self.__head = (self.__head + 1) % self.__len
        self.__num = self.__num - 1
        return elem

    def enqueue(self, elem):
        if self.__num == self.__len:
            self.__extend()
        self.__elems[(self.__head + self.__num) % self.__len] = elem
        self.__num = self.__num + 1

    def __extend(self):
        old_len = self.__len
        self.__len *= 2
        new_elems = [0] * self.__len
        for i in range(old_len):
            new_elems[i] = self.__elems[(self.__head + i) % old_len]
        self.__elems, self.__head = new_elems, 0


class LNode():
    def __init__(self, elem, next_=None):
        self.elem = elem
        self.next = next_
        

class LinkQueue(): #链表实现队列类
    def __init__(self):
        self.__head = None
        self.__rear = None

    def __len__(self):
        i, p = 0, self.__head
        while p:
            i += 1
            p = p.next
        return i

    def is_empty(self):
        return self.__head is None #只需用__head来判断是否为空队列

    def peek(self):
        if self.__head is None:
            raise QueueUnderflow("队列为空")
        return self.__head.elem

    def dequeue(self):
        if self.__head is None:
            raise QueueUnderflow("队列为空")
        p = self.__head
        self.__head = self.__head.next
        return p.elem
    
    def enqueue(self, elem):
        if self.__head is None:
            self.__rear = LNode(elem)
            self.__head = self.__rear
        else:
            self.__rear.next = LNode(elem)
            self.__rear = self.__rear.next


if __name__ == '__main__':
    lib = "123456789"
    s1 = ListQueue()
    s2 = LinkQueue()
    for i in lib:
        s1.enqueue(i)

    print(len(s1), len(s2))
    
    while not s1.is_empty():
        s2.enqueue(s1.peek())
        print(s1.dequeue())

    print(len(s1), len(s2))
    
    while not s2.is_empty():
        print(s2.dequeue())
 

猜你喜欢

转载自blog.csdn.net/QiaoRuoZhuo/article/details/84997318
今日推荐