python的queue模块,

  python的queue模块,

  在“数据结构”课程中,最常讲授的数据结构是堆栈、队列和队列。

  Stack是一种特殊的线性表,只允许一端插入和删除,称为栈顶,另一端称为栈底。

  从栈顶插入一个元素叫做pushing,并且在栈顶插入一个元素叫做“推入栈”,对应的英文表达是push相应地,从栈顶删除一个元素叫做pop,从栈顶删除一个元素叫做pop。

  对于栈来说,栈上的第一个元素位于栈底,只有当上面的元素都出栈了,底部的元素才能出栈。因此,堆栈是一种后进先出(LIFO)线性表。图1显示了堆栈的操作图。

  Queue也是一个特殊的线性表,只允许在表的前面删除,在表的后面插入。插入操作的结束称为队列的结束,删除操作的结束称为队列的头。

  对于队列,每个元素总是从队列的后端进入队列,然后当前元素可以在它之前的所有元素出队之后出队。因此,队列是一个先进先出(FIFO)线性表。队列图如图2所示。

  dequee(也就是这里介绍的dequee)代表一种特殊的队列,可以在两端同时插入和删除,如图3所示。

  对于一个双端队列,它可以从两端插入和删除。如果程序在一端修复了所有的插入和删除操作,那么队列就变成了一个堆栈。如果在一端只添加元素,在另一端只删除元素,那么它就成了一个队列。因此,deque既可以用作队列,也可以用作堆栈。

  Deque位于collections包下。首先在交互式解释器中导入collections包,然后在dir中输入[e for e(collections。dequee)if not e . starts with( _ )]命令查看dequee的所有方法。您可以看到以下输出结果:

  fromcollectionsimportdeque

  [efore indir(deque)if note . starts with( _ )]

  [append , appendleft , clear , copy , count , extend , index , insert , maxlen , pop , popleft , remove , reverse , rotate]

  从上面的方法可以看出,deque的方法基本上有两个版本,体现了它作为一个deque的特点。德克尔的左边(左)相当于它的队列头(前),右边(右)相当于它的队列尾(后):

  Append和appendleft:将元素添加到deque的右边或左边,即默认情况下在队列的末尾添加元素。

  和popleft:弹出deque右边或左边的元素,即默认弹出队列末尾的元素。

  Extend和extendleft:在deque的右边或左边添加多个元素,即默认在队列的末尾添加多个元素。

  deque中的clear()方法用于清空队列;insert()方法是一种线性表方法,用于在指定位置插入元素。

  如果程序想使用deque作为堆栈,这意味着只在一端添加和删除元素,所以调用append和pop方法。例如,下面的程序:

  从上面的方法可以看出,deque的方法基本上有两个版本,体现了它作为一个deque的特点。德克的左边(左

  )就相当于它的队列头(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 的队尾元素都会被移到队头,这样就形成了首尾相连的效果。

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: