【数据结构】python队列

参考:www.bilibili.com/video/BV1E4…

python实现

python没有数组的概念,而是用list封装了数组,list可以很好的完成队列的一些需求,而且队列(list)可以无限的增长,python内部完成扩容,数据迁移等操作。当然除了list方式还可以用链表的方式完成队列功能

list方式

class Queue(object):
    def __init__(self, limit: int):
        """
        :param limit: 限制队列的容量
        """
        self.limit = limit
        self.data_list = []

    def add_data(self, data: int):
        # 满了就扩容
        if self.is_full():
            self.limit *= 2
        self.data_list.append(data)

    # 弹出队首的数据
    def del_data(self):
        if not self.is_Empty():
            return self.data_list.pop(0)
        else:
            print("队列为空")

    # 判断队列是否为空
    def is_Empty(self):
        return len(self.data_list) == 0

    # 判断是否满了
    def is_full(self):
        return len(self.data_list) == self.limit

    # 查看下一个要处理的数据
    def peek(self):
        if not self.is_Empty():
            return self.data_list[0]
        else:
            print("队列为空")

    def print_list(self):
        for data in self.data_list:
            print(data, end="<-")
        print()

    def info(self):
        print("当前队列有{}个元素,容量为{}".format(len(self.data_list), self.limit))


q = Queue(5)
q.add_data(1)
q.add_data(2)
q.add_data(3)
print(q.peek())
q.print_list()
q.info()
print(q.del_data())
q.print_list()
q.info()
q.add_data(4)
q.add_data(5)
q.add_data(6)
q.add_data(7)
q.print_list()
q.info()

链表方式

class Node:
    def __init__(self, data, nextNode=None):
        self.data = data
        self.next = nextNode


class Queue:
    def __init__(self, limit=10):
        self.root = Node(None)
        self.head = self.root
        self.tail = self.root
        self.length = 0
        self.limit = limit

    def is_Empty(self):
        return self.length == 0

    def is_Full(self):
        return self.length == self.limit

    def add_data(self, data):
        if self.is_Full():
            self.limit *= 2
        node = Node(data)
        self.tail.next = node
        self.tail = node
        self.length += 1

    def del_data(self):
        if self.is_Empty():
            print("队列为空")
            return
        temp = self.head
        if temp == self.root:
            self.length -= 1
            self.head = self.head.next.next
            return temp.next
        else:
            self.length -= 1
            self.head = self.head.next
            return temp

    def print_queue(self):
        temp = self.head
        while temp:
            print(temp.data, end="->")
            temp = temp.next
        print()

    def info(self):
        print("当前有{}个元素,容量是{}".format(self.length, self.limit))

    def peek(self):
        return self.tail


q = Queue(5)
print(q.is_Empty())
print(q.is_Full())
q.info()
q.add_data(1)
q.add_data(2)
q.add_data(3)
q.info()
q.del_data()
q.print_queue()
q.info()
q.add_data(4)
q.add_data(5)
q.print_queue()
q.info()
q.add_data(6)
q.add_data(7)
q.info()
q.print_queue()
q.del_data()
q.print_queue()
q.del_data()
q.print_queue()
q.del_data()
q.print_queue()
q.info()
q.add_data(8)
q.add_data(9)
q.add_data(10)
q.add_data(11)
q.add_data(12)
q.print_queue()
q.info()