一、双端队列
双端队列跟队列相似是一种有次序的数据集,跟队列相似,两端成为首尾端,但双端队列中的数据项既可以从两端加入,也可以从两端移除。某种意义来说,双端队列集成了栈和队列的能力。
双端队列不具备先进先出或后进先出的特性,如果用双端队列来模拟栈或队列需要由使用者自行维护操作的一致性。
二、双端队列抽象数据类型
Deque():创建一个空双端队列
addFront(item):将item加入队首
addRear(item):将item加入队尾
removeFront():从队首移除数据,返回值为移除的数据项
removeRear():从队尾移除数据,返回值为移除的数据项
isEmpty():返回双端队列是否为空
size():返回双端队列中包含数据项的个数
三、用Python实现双端队列
采用List实现:List下标为0作为deque的尾端;List下标为-1作为deque的首端。在前端进行添加和移除操作的时间复杂度为O(1);后端则是O(n)。
四、双端队列的应用---回文词判定
回文词是指正读和反读都一样的词,如radar、madam、toot。
用双端队列很容易解决回文词的问题,先将需要判定的词从队尾加入deque,再从两端同时移除字符判定是否相同,直到deque中剩下0个或1个字符。
Python的实现:五、列表
在前边学习的基本数据结构中,我们采用Python List实现了多种线性数据结构。列表是一种简单强大的数据集结构,提供了丰厚的操作接口,但并不是所有的编程语言都提供了List数据类型,有时需要程序员自己实现。
一种数据项按照相对位置存放的数据集被称为无序列表,数据项只按照存放位置来索引,如第一个、第二个……、最后一个等。为简单起见,假设列表不存在重复数据项。如一个考试分数的集合“54,26,93,17,77,31”,用无序表表示为[54 26 93 17 77 31]
六、无序表的抽象数据类型
List():创建一个空列表
add(item):添加一个数据项到列表中,假设item原先不在列表中
remove(item):从列表中移除item,列表被修改,item原先在表中
search(item):在列表中查找item,返回布尔类型值
isEmpty():返回列表是否为空
size():返回列表中包含数据项的个数
append(item):添加一个数据项到表末尾,假设item原先不存在列表中
index(item):返回数据项在表中的位置
insert(pos,item):将数据项插入到位置pos,假设item原先不存在列表中,原列表具有足够多个数据项,能让item占据位置pos
pop():从列表末尾移除数据,假设原列表至少有一个数据项
pop(pos):移除位置为pos的数据项,假设原列表存在位置pos
七、采用链表实现无序表
为了实现无序列表,我们要构建链表。虽然列表数据结构要求保持数据项的前后相对位置,并没有要求数据项依次存放在连续的存储空间。如下图,数据项存在位置并没有规则,但如果在数据项之间建立链接指向,就可以保持前后相对位置了。第一个和最后一个数据需要显式标记出来,一个是队首,一个是队尾,后边再无数据了。
节点Node
链表实现的最基本元素是节点Node,每个节点至少要包含两个信息:数据项本身、指向下一节点的引用信息。(当next=None时,就没有下一个节点了)
链表实现节点Node
—END—