Python实现的数据结构与算法之双端队列详解
什么是双端队列?
双端队列是一种具有队列和栈的性质的数据结构,可以在队列两端进行插入和删除操作。双端队列可以实现两端的操作,因此可以在队列两端进行插入和删除操作,既可以像队列一样先进先出,也可以像栈一样后进先出。
双端队列的操作
- add_front(item):在队头插入一个元素;
- add_rear(item):在队尾插入一个元素;
- remove_front():在队头删除一个元素;
- remove_rear():在队尾删除一个元素;
- is_empty():判断队列是否为空;
- size():返回队列中元素的个数。
双端队列的实现
双端队列可以通过列表来实现,但是每次在队头插入或删除操作时,需要对列表进行移动,因此效率较低。可以使用collections中的双端队列Deque来实现。
from collections import deque
deque = deque()
deque.appendleft(item) # 添加左元素
deque.append(item) # 添加右元素
deque.popleft() # 删除左元素
deque.pop() # 删除右元素
deque.clear() # 清空双端队列
deque.count(item) # 返回元素出现次数
deque.extend(iterable) # 从右侧加入多个元素
deque.extendleft(iterable) # 从左侧加入多个元素
deque.index(item, start=0, end=None) # 返回第一个元素所在位置的索引
deque.remove(item) # 删除第一个出现的元素
deque.reverse() # 反转双端队列
deque.rotate(n=1) # 将双端队列右移n个索引位置,第一个元素移到最后
示例说明
示例一:使用双端队列实现回文字符串判断
回文字符串是指正反读都相同的字符串,例如"level"和"noon"。使用双端队列可以很方便地判断一个字符串是否为回文字符串。
from collections import deque
def palchecker(aString):
chardeque = deque()
for ch in aString:
chardeque.appendleft(ch)
stillEqual = True
while len(chardeque) > 1 and stillEqual:
first = chardeque.popleft()
last = chardeque.pop()
if first != last:
stillEqual = False
return stillEqual
print(palchecker("level"))
print(palchecker("hello"))
在本例中,通过双端队列先把字符串的每个字符从左到右依次插入队列头部。然后每次从队头取出第一个字符和队尾取出最后一个字符进行比较,如果不相等则判断不是回文字符串,否则继续循环比较。最后如果整个字符串都没有出现不相等的情况,则判断为回文字符串。
示例二:使用双端队列实现迷宫求解
使用双端队列也可以实现迷宫的求解,具体实现方法是先把起点插入队尾,然后依次从队首取出一个路径,把它的下一步路径依次插入队尾,直到到达终点。
from collections import deque
def search(maze, start, end):
queue = deque()
queue.append(start)
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 定义方向,顺序不能变
while len(queue) > 0:
pos = queue.popleft()
for direction in directions:
next_pos = (pos[0]+direction[0], pos[1]+direction[1])
if next_pos == end:
print("到达终点")
return True
if maze[next_pos[0]][next_pos[1]] == 0:
queue.append(next_pos)
maze[next_pos[0]][next_pos[1]] = -1
print("无法到达终点")
return False
在本例中,使用了一个二维数组来表示迷宫,0表示该位置可以通过,1表示该位置不可以通过,-1表示该位置已经走过。先把起点插入队尾,然后依次从队首取出一个位置,再分别从其四个方向进行搜索,如果下一步能够到达终点,则说明迷宫已经被解开,否则把下一步路径插入队尾继续搜索,直到队列为空。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现的数据结构与算法之双端队列详解 - Python技术站