在上一篇文章中,我们分析了如何使用python实现队列以及简单举了一个传递热土豆问题的循环队列实现,在这篇文章中,我们将尝试使用python实现另一个队列中的常用问题 -- 双端队列。
首先我们来聊一聊双端队列的实现,内容比较简单。与普通队列的实现类似,我们使用列表作为其中的主体部分,代码如下:
class bioLine:
# 初始化
def __init__(self):
self.items = []
# 获取长度
def getlength(self):
return len(self.items)
# 头入队
def addFront(self, val):
return self.items.insert(0,val)
# 尾入队
def addRear(self,val):
return self.items.append(val)
# 头出队
def popFront(self):
return self.items.pop(0)
# 尾出队
def popRear(self):
return self.items.pop()
# 输出队列中的元素
def show(self):
for i in self.items:
print(i, end = "\t")
在这个类中,我们实现了:
1, 使用列表作为主体,初始化双端队列
2, 利用append和insert函数实现了双端队列的头入队和尾入队
3, 使用pop函数实现队首和队尾的出队
4, 遍历这个队列
那么到这块一个基本的双端队列就实现了,现在我们来看一道例题:回文数或者是回文字符串的判定。
从 基本的原理上来说,这个题目是非常适合用双端队列或者双指针来解题的由于双指针解法较为简单,我们就不再举例,这里主要是以这道题目来举例双端队列的应用。
根据回文数的特性,也就是轴对称序列,我们可以将其存进双端队列,然后队列两端同时出队直到队列中没有元素或者只剩下一个元素为止,基本思路就是这样的,现在我们借用上面实现的双端队列来实现这个算法,代码如下:
# 初始化一个队列
bl = bioLine()
# 输入字符串以作为判定的用例
nums = input()
# 将测试用例存进队列
for i in nums:
bl.addRear(i)
bl.show()
# 循环终止条件:队列中不存在元素或者说只存在一个元素
while bl.getlength() > 1:
# 不断比较队列内部元素,只要有一个不满足就不是回文序列
if bl.pushFront() != bl.pushRear():
print(nums, "不是回文数或字符串!")
break
else:
print(nums, '是回文数或字符串!')
那么以上就是本篇文章的所有内容了,如有不当之处,欢迎评论区指正!