数据结构与算法(7)——队列Queue

  • 队列基础定义

队列:一种有次序的数据集合。其特点是新数据项的添加总发生在尾端(rear)而现存数据项的移除总发生在另一端(首端front),先进先出

队列只有一个入口,一个出口。当数据加入队列,首先出现在队尾,随着首数据项的移除,它逐渐接近队首。不允许数据项直接插入队中,也不允许从中间移除数据项(可联想成水管流动,排队等情况)

  •  抽象数据类型Queue类型-python
Queue() 创建一个空队列对象,返回值为Queue对象
enqueue(item) 将数据项item添加到队尾,无返回值
dequeue() 从队首移除数据项,返回值为队首数据项,队列被修改
isEmpty() 测试队列是否为空,返回值为bool类型
size() 返回队列中数据项的个数

用python自定义一个队列:

 1 class Queue:
 2     def __init__(self):
 3         self.items = []
 4 
 5     def isEmpty(self):
 6         return self.items == []
 7 
 8     def enqueue(self, item): #复杂度O(n)
 9         self.items.insert(0,item)
10 
11     def dequeue(self): #复杂度O(1)
12        return self.items.pop()
13 
14     def size(self):
15         return len(self.items)
16 Q = Queue()
17 Q.enqueue(0)
18 Q.enqueue(1)
19 Q.enqueue('a')
20 print(Q.size())
[OUT]
3

Process finished with exit code 0
  • 队列的应用
  1. 热土豆问题(约瑟夫问题)

问题描述:传烫手的热土豆,鼓声停的时候,手里有土豆的小朋友需要出列。(不想敲字了,直接截图PPT)

 分析:用队列来实现。用Queue存放所有参加游戏的人名,队首默认为拥有土豆的人,游戏开始,队首的人出列,然后随即到队尾入队,记为土豆的一次传递,传了num次后,将队首的人移除,不再入队,如此反复,直到队列中只剩一个人。

 代码:

 1 from queue1 import Queue
 2 
 3 def hotPotato(namelist, num):
 4     simqueue = Queue()
 5 
 6     for name in namelist:
 7         simqueue.enqueue(name)
 8 
 9     while simqueue.size() >1:
10         for i in range(num):
11             simqueue.enqueue(simqueue.dequeue())  #一次传递
12 
13         simqueue.dequeue()
14     return simqueue.dequeue()
15 print(hotPotato(['a','b','c','d','e','f','g'],7))
d

Process finished with exit code 0

参考:https://www.bilibili.com/video/BV1QJ411w7bB?p=23

猜你喜欢

转载自www.cnblogs.com/yeshengCqupt/p/12590555.html