前言:此篇只为本人小菜鸟的练习,如有错误,还烦请大家指出。
自设队列
队列同样作为一个简单的线性数据结构,用来存储不同的数据,其原则与栈相反,严格遵守了first in last out(filo)原则,简单可以理解为子弹,排队等模型,其并不能像栈那样仅仅使用python内部列表的特性去完成filo的队列(原因很简单,如果我们需要出队列元素时,很明显我们需要将第一个删除,那么第一个后面所有的元素都会挪动,这样的效率实在太低了),因此我们采用环形列表来实现队列。
此环形并非物理结构上的环形,而是逻辑结构,具体实现环形我们采用取余的方法,下文会有详细说明,此外,队列与栈还有一个不同那便是大小的约束,实现栈时,其大小一般初始化为0,随着插入和删除大小发生变化,但是队列一开始是有大小的规定的,即初始化时就要指定队列的大小。
附上一张环形队列的草图。
由于队列存在大小的限制,那边多出了许多不同于栈的操作,自动增容,判断是否队列已满等等。
因此,我们需要区分出判满和判空的操作(由于初始化规定大小,所以队内还要多少是不清楚的),为此我们牺牲了队列中的一个位置,定义出两个指针front和rear,rear随着增加元素而移动,先移动后增加,而front随着删除移动,先移动后删除,从始至终我们都要保证front指向的位置没有元素,并不是真的没有元素,而是front指向的元素并不属于队内!这样就可以区分开判满和判空,即若front 等于rear就是空,若rear+1等于front就是满。
交代完这些要点就开始用类实现一个环形队列吧。
class Queue:
def __init__(self,size):
self.size = size # 指定队列规模
self.queue = [0 for _ in range(self.size)]
self.rear = 0 # 增加元素指针
self.front = 0 # 删除指针
rear和front都初始化为0,传入的参数size是指定队列的规模大小,至此开始队列的一些操作。
回到前文提到的环形队列采用取余的方法实现的意思是对于超出队列大小的下标我们