Python queue双端队列模块及用法

在“数据结构”课程中,最常见的数据结构包括栈、队列和双端队列。
栈是一种特殊的线性表,只允许在一端插入和删除。这一端称为栈顶(top),另一端称为栈底(bottom)。
将一个元素插入栈顶称为进栈,将一个元素插入栈顶称为“压入栈” push;相应地,从栈顶删除一个元素叫做出栈,从栈顶删除一个元素叫做“弹出栈” pop。
对于堆栈来说,第一个进入堆栈的元素位于堆栈的底部。只有当上述所有元素都离开堆栈时,堆栈底部的元素才能离开堆栈。因此,堆栈是一种后进先出(LIFO)线性表。如图所示 1 所示为栈的操作示意图。

队列也是一种特殊的线性表,只允许在表的前端(front)删除操作,在表的后端(rear)插入操作。插入操作的端称为队尾,删除操作的端称为队头。
对于一个队列来说,每个元素总是来自队列 rear 端进队列,然后等待元素之前的所有元素出队,当前元素才能出队。因此,队列是先进先出的(FIFO)线性表。队列示意图如图所示 2 所示。

双端队列(即此处介绍的) deque)它代表一个特殊的队列,可以同时插入和删除两端,如图所示 3 所示。
对于双端队列,可以从两端插入和删除。如果程序将所有插入和删除操作固定在一端,则双端队列将成为栈;如果一端只添加元素,另一端只删除元素,则成为队列。因此,deque 它可以作为队列或堆栈使用。
deque 位于 collections 首先在交互式解释器中导入包 collections 包,然后输入 [e for e in dir(collections.deque) if not e.startswith('_')] 命令来查看 deque 所有方法都可以看到以下输出结果:
>>>fromcollectionsimportdeque
>>>[eforeindir(deque)ifnote.startswith('_')]
['append','appendleft','clear','copy','count','extend','extendleft','index','insert','maxlen','pop','popleft','remove','reverse','rotate']从以上方法可以看出,deque 基本上有两个版本的方法,这反映了它作为双端队列的特点。deque 的左边(left)相当于它的队列头(front),右边(right)相当于它的队列尾(rear):
append 和 appendleft:在 deque 在右侧或左侧添加元素,即默认在队列尾部添加元素。
pop 和 popleft:在 deque 右侧或左侧弹出元素,即默认在队列尾部弹出元素。
extend 和 extendleft:在 deque 在右侧或左侧添加多个元素,即默认在队列尾部添加多个元素。
deque 中的 clear() 该方法用于清空队列:insert() 该方法是将元素插入指定位置的线性表的方法。
假如程序要把 deque 作为栈使用,意味着只在一端添加和删除元素,所以调用 append 和 pop 方法就够了。例如,以下程序:
从以上方法可以看出,deque 基本上有两个版本的方法,这反映了它作为双端队列的特点。deque 的左边(left)相当于它的队列头(front),右边(right)相当于它的队列尾(rear):
append 和 appendleft:在 deque 在右侧或左侧添加元素,即默认在队列尾部添加元素。
pop 和 popleft:在 deque 右侧或左侧弹出元素,即默认在队列尾部弹出元素。
extend 和 extendleft:在 deque 在右侧或左侧添加多个元素,即默认在队列尾部添加多个元素。
deque 中的 clear() 该方法用于清空队列:insert() 该方法是将元素插入指定位置的线性表。
假设程序要把 deque 作为栈使用,意味着只在一端添加和删除元素,所以调用 append 和 pop 方法就够了。例如,以下程序:
fromcollectionsimportdeque
stack=deque(('Kotlin','Python'))
#元素入栈
stack.append('Erlang')
stack.append('Swift')
print('stack中的元素:',stack)
#元素出栈后,添加的元素先出栈
print(stack.pop())
print(stack.pop())
print(stack)操作上述程序时,可以看到以下操作结果:
stack中的元素:deque(['Kotlin','Python','Erlang','Swift']) Swift Erlang deque(['Kotlin','Python'])
从以上操作结果可以看出,程序最终进入栈的元素“Swift“第一个出栈,体现了栈 LIFO 特征。如果程序需要把程序。 deque 作为队列使用意味着一端只用于添加元素,另一端只用于删除元素,因此调用 append、popleft 方法就够了。例如,以下程序:
fromcollectionsimportdeque
q=deque(('Kotlin','Python'))
#加入队列中的元素
q.append('Erlang')
q.append('Swift')
print('q中的元素:',q)
#元素出队列,先添加元素出队列
print(q.popleft())
print(q.popleft())
print(q)操作上述程序时,可以看到以下操作结果:
q中的元素:deque(['Kotlin','Python','Erlang','Swift']) Kotlin Python deque(['Erlang','Swift'])
从以上操作结果可以看出,程序首先添加的元素“Katlin“第一个队列,这反映了队列 FIFO 的特征。
此外,deque 还有一个 rotate() 该方法的作用是将队列的队尾元素移动到队头,使其首尾相连。例如,以下程序:
fromcollectionsimportdeque
q=deque(range(5))
print('q中的元素:',q)
#执行旋转,使其首尾相连
q.rotate()
print('q中的元素:',q)
#再次执行旋转,使其首尾相连
q.rotate()
print('q中的元素:',q)在操作上述程序时,可以看到以下输出结果:
q中的元素:deque(0,1,2,3,4) q中的元素:deque(4、0、1、2、3) q中的元素:deque(3、4、0、1、2)
从上述输出结果来看,每次执行 rotate() 方法,deque 所有的队尾元素都会移到队头,从而形成首尾相连的效果。
