python 完成队列以及循环队列的书写

一般队列

队列:是一个有序表,可以使用数组或者链表来实现

           遵循的是先入先出的原则

           队列是需要两个指针的,一个使用与添加数据,一个是用于输出数据的,当两个指针相同时表示该队列是空队列

import numpy as np
class ArrayQueue():
    def __init__(self,maxsize = 10):
        super(ArrayQueue, self).__init__()
        self.list =[]
        self.maxSize = maxsize
        self.front = -1 # 指向 队列头部
        self.rear = -1  # 指向队列尾部
    # 判断队列中是否已满
    def isfull(self):
        return self.rear == self.maxSize -1
    # 判断队列中是否已空
    def isEmpty(self):
        return self.rear == self.front
    # 增加队列的数据
    def addQueue(self,x):
        if self.isfull():
            print("队列已经满了,不能加入数据了")
            return
        self.rear = self.rear + 1
        self.list.append(x)
    # 取出队列中的数据
    def getQueue(self):
        if self.isEmpty():
            print("队列已经空了,不能取数据")
            return
        self.front = self.front + 1
        data = self.list.pop()
        print("队列取出来的数据为:",data)
        return data
    # 显示队列中数据
    def showlist(self):
        if self.isEmpty():
            print("队列已经空了,不能取数据")
            return
        print(self.list)

    def headQueue(self):
        if self.isEmpty():
            print("队列已经空了,不能取数据")
            return
        return self.list[self.front]

if __name__ == '__main__':
    arrayqueue = ArrayQueue()
    while True:
        key = input("请输入相应的值选项:")
        if key == "s":
            arrayqueue.showlist()
        elif key == "g":
            arrayqueue.getQueue()
        else:
            arrayqueue.addQueue(int(key))


循环队列

环形队列就是可以直接不断的填充到队列中,然后也可以不断地取(当然这两种操作都是需要在队列的最大容量中)

数组模拟环形队列的思路分析:

  1. Front指针的变量进行调整:指向队列的第一个元素.front的初始值为0
  2. Rear指针也做一下调整:指向队列的最后一个元素的后一个位置,因为希望空出一个空间做约定,rear的初始值也为0
  3. 当队列满时rear = maxsize – 1(原先的)现在的是(rear + 1)%maxsize = front
  4. 当队列为空的时候,rear == front
  5. 当我们这样进行分析的时候,队列中的有效数据的个数为 (rear + maxsize -front)%maxsize
  6. 就可以在原来的代码中进行修改
import numpy as np
class ArrayQueue():
    def __init__(self ,maxsize = 4):
        super(ArrayQueue, self).__init__()
        self.list =[]
        self.maxSize = maxsize
        self.front = 0  # 指向 队列头部 原来等于-1的时候表示等于第一个数据的前一个
        self.rear = 0  # 指向队列尾部的值的后一个位置

    # 判断队列中是否已满
    def isfull(self):
        #return self.rear == self.maxSize - 1
        p = (self.rear + 1) % self.maxSize == self.front
        return p
    # 判断队列中是否已空
    def isEmpty(self):
        return self.rear == self.front

    # 增加队列的数据
    def addQueue(self, x):
        if self.isfull():
            print("队列已经满了,不能加入数据了")
            return
        self.list.append(x)
        self.rear = (self.rear + 1) % self.maxSize  # 因为有可能直接到前面的位置

    # 取出队列中的数据
    def getQueue(self):
        if self.isEmpty():
            print("队列已经空了,不能取数据")
            return
        # 先把front对应的值保存到一个临时变量
        # front后移
        # 将临时变量返回
        data = self.list.pop()
        self.front = (self.front + 1) % self.maxSize
        print("队列取出来的数据为:", data)
        return data

    # 显示队列中数据
    def showlist(self):
        if self.isEmpty():
            print("队列已经空了,不能取数据")
            return
        for i in range(self.front,self.numqueue()):
            print("列表的中的数据为{}".format(i % self.maxSize),self.list[i % self.maxSize])

    # 返回当前循环队列中的有效数据的个数
    def numqueue(self):
        return (self.rear + self.maxSize - self.front) % self.maxSize

    def headQueue(self):
        if self.isEmpty():
            print("队列已经空了,不能取数据")
            return
        print("头部数据为:",self.list[self.front])

if __name__ == '__main__':
    arrayqueue = ArrayQueue()
    while True:
        key = input("请输入相应的值选项:")
        if key == "s":
            arrayqueue.showlist()
        elif key == "g":
            arrayqueue.getQueue()
        elif key == "h":
            arrayqueue.headQueue()
        elif key == "q":
            break
        else:
            arrayqueue.addQueue(int(key))

猜你喜欢

转载自blog.csdn.net/weixin_44911037/article/details/128011712
今日推荐