概述

什么是队列,简单而言:先进先出。

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。

进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列中没有元素时,称为空队列。

队列的数据元素又称为队列元素。

在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。

因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。

代码实现

# -*- coding:utf-8 -*-


__author__ = '苦叶子'


class Queue:
    def __init__(self, size=30):
        # 初始化队列长度
        self.size = size        

        # 初始化队列列表
        self.queue = []        

        # 初始化队列前端、后端位置
        self.front = 0
        self.rear = -1

    # 判断队列是否为空
    def is_empty(self):
        return self.rear == 0

    # 判断队列是否满了
    def is_full(self):
        res = False
        if (self.rear - self.front + 1) == self.size:
            res = True

        return res    
    
    # 入队
    def add(self, obj):
        if self.is_full():            
            raise Exception("我去,队列满了……")        
        else:
            self.queue.append(obj)
            self.rear += 1

    # 出队
    def delete(self):
        if self.is_empty():            
            raise Exception("队列是空的,出不了了……")        
        else:
            self.rear -= 1
            self.queue.pop(0)    
    
    # 队列头元素
    def first(self):
        if self.is_empty():            
            raise Exception("队列是空的啦……")    
        else:            
            return self.queue[self.front]    
            
    # 队列尾元素
    def last(self):
        if self.is_empty():            
            raise Exception("队列是空的啦……")        
        else:            
            return self.queue[self.rear]    
            
    # 打印队列
    def show(self):
        print(self.queue)


if __name__ == "__main__":

    print("队列实现示例")    

    # 初始化长度为5的队列
    queue = Queue(5)    
    
    # 先把1-5的数据入队
    for index in range(1, 6):
        queue.add(index)    
    
    # 打印下队列数据
    queue.show()    
    
    # 打印下队列头
    print(queue.first())    
    
    # 打印下队列尾
    print(queue.last())    

    # 出个队试试
    queue.delete()    

    # 打印下队列看下是否出队了
    queue.show()    
    
    # 再出个队试试
    queue.delete()    
    
    # 打印下队列看下是否出队了
    queue.show()

小结

队列的关键点:

  1. 先进先出
  2. 注意溢出的处理