《数据结构与算法Python语言描述》学习笔记(4)–队列
chap 5 栈和队列
队列先进先出FIFO
队列的基本操作也是一个封闭集合,通常包括:创建新队列对象(如创建空队列);判断队列的是否为空;入队;出队;查看队头;
队列的链接表实现
一端插入,一端删除。带有尾指针的单链表实现队列很easy
队列的顺序表实现
循环顺序表—>循环队列
1)顺序表的开始位置不变;
2)队头变量记录当前队列里第一个元素的位置;队尾变量记录当前队列里最后元素之后的第一个空位
3)队列元素保存在顺序表的一段连续单元里,[q.head:q.rear]左闭右开区间。
4)初始队列为空时,应该让对头指针q.head和队尾指针q.rear指向同一个位置。
5)出队和入队操作分别需要更新变量q.head和q,rear
q.head = (q.head+1) %q.len
q.rear = (q.rear+1)%q.len
6)队满的判断:(q.rear +1)%q.len = q.head
队列的list实现
定义顺序表队列类命名尾SQueue,
1)在SQueue对象里用一个list类型的成分_elems存放队列元素
2)用_head记录队列首元素所在位置的下标和_num记录表中元素的个数
3)_len记录当前表的长度,判断队满;
数据不变式
实现一种数据结构里的操作时,最基本的问题就是这些操作需要维护对象属性之间的正确关系,这样一套关系被称为这种数据结构的数据不变式。
数据不变式说明对象的不同属性的性质,描述它们应满足的逻辑约束关系。数据不变式队相关操作提出了一些约束,作为正确实现的基本保证,包括两方面:
1)所有构造对象的操作,都必须把对象成分设置为满足数据不变式的状态,也即,对象的初始状态应满足数据不变式。
2)每个对象操作都应保证不破坏数据不变式,也就是说,如果队一个朱姑娘台湾好的对象应用一个操作,当操作完成时,还必须保证对象处于完好的状态。
队列实现中考虑的数据不变式:
1)_elems属性引用着队列的元素存储区,是一个list对象,_len属性记录存储区的有效容量
2)_head时队列中首元素的下标,_num始终记录着队列中元素的个数。
3)当时队列的元素总保存在_elems里从_head开始的而连续位置中,新入队的元素存入由_head+_num算出的位置,但需要吧元素村委下标_len的位置时,改为在下标0位置存入该元素。
4)在_num == _len的情况下出现入队列操作,就扩大存储区。
# 队列的list实现
class QueueUnderflow(ValueError):