一、队列的实现
python
class Queue:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def enqueue(self, item):
self.items.insert(0, item)
def dequeue(self):
return self.items.pop()
def size(self):
return len(self.items)
二、实例问题
1.模拟传土豆
思路:
假设握着土豆的孩子位于队列的头部。在模 拟传土豆的过程中,程序将这个孩子的名字移出队列,然后立刻将其插入队列的尾部。随后,这 个孩子会一直等待,直到再次到达队列的头部。在出列和入列 num 次之后,此时位于队列头部 的孩子出局,新一轮游戏开始。如此反复,直到队列中只剩下一个名字(队列的大小为 1)。
python
from main import Queue
def hotPotato(namelist, num):
simqueue = Queue()
# 将名字加入到列表中
for name in namelist:
simqueue.enqueue(name)
while simqueue.size() > 1:
# 实现了一个环,将头部元素出列,再使得该元素入列到尾部
for i in range(num):
simqueue.enqueue(simqueue.dequeue())
simqueue.dequeue()
return simqueue.dequeue()
result = hotPotato(["Bill", "David", "Susan", "Jane", "Kent", "Brad"], 7)
print(result)
2.模拟打印机(还未看懂--4.20更新)
三、双端队列
1.实现方式
须有的功能
python
class Deque:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
# 前端添加元素
def addFront(self, item):
self.items.append(item)
# 后端添加元素
def addRear(self, item):
self.items.insert(0, item)
def size(self):
return len(self.items)
# 从前端移除一个元素
def removeFront(self):
return self.items.pop()
# 从后端移除一个元素
def removeRear(self):
return self.items.pop(0)
2.实际应用
2.1回文检测器
思路:
使用一个双端队列来存储字符串中的字符。按从左往右的顺序将字符 串中的字符添加到双端队列的后端。此时,该双端队列类似于一个普通的队列。然而,可以利 用双端队列的双重性,其前端是字符串的第一个字符,后端是字符串的最后一个字符,两者是否相等
python
# class Deque我定义在main.py文件中,用前需导入
from main import Deque
def palchecker(aString):
'''
回文检测器
:param aString: 传入字符串
:return: bool型数据
'''
chardeque = Deque() # 定义双端队列
# 从做到用遍历字符串并将其添加到双端队列的后端
for ch in aString:
chardeque.addRear(ch)
stillEqual = True # 用于判断是否为回文字符串
while chardeque.size() > 1:
leftchar = chardeque.removeFront() # 原先左边字符
rightchar = chardeque.removeRear() # 原先右边字符
if leftchar != rightchar:
stillEqual = False
return stillEqual
result = palchecker("palchecker")
print(result)