PYTHON数据结构-双端队列[deque]-具有队列和栈的特性

双端队列(deque)是一种具有队列和栈的特性的数据结构。它支持在两端进行插入和删除操作,因此可以在队列的两端进行快速的插入和删除操作,而不像列表(list)一样需要移动元素。在Python中,双端队列可以通过`collections`模块的`deque`类来创建和操作。

双端队列的主要操作包括:
- `append(item)`: 在队列的右端(尾部)添加一个元素。
- `appendleft(item)`: 在队列的左端(头部)添加一个元素。
- `pop()`: 移除并返回队列的最右端(尾部)的元素。
- `popleft()`: 移除并返回队列的最左端(头部)的元素。

- `extend(iterable)`: 在队列的右端(尾部)扩展一个可迭代对象中的所有元素。
- `extendleft(iterable)`: 在队列的左端(头部)扩展一个可迭代对象中的所有元素,注意扩展的顺序与可迭代对象的顺序相反。
- `rotate(n)`: 将队列中的所有元素向右移动`n`步(如果`n`为负数,则向左移动)。

双端队列的使用可以提高队列头部和尾部的操作效率,特别适用于需要频繁从两端添加或删除元素的场景,比如广度优先搜索算法中的队列操作。

-------------

 在这个例子中,我们首先创建了一个空的双端队列 task_queue。然后,我们使用 append 方法向队列的尾部依次添加了三个任务。接着,我们通过 while 循环不断从队列的头部取出任务并执行,直到队列为空为止。在每次循环中,我们使用 popleft 方法从队列头部取出一个任务,并通过 print 函数执行该任务。

from collections import deque

# 创建一个空的双端队列
task_queue = deque()

# 添加任务到队列的尾部
task_queue.append("Task 1")  # 添加任务1到队列尾部
task_queue.append("Task 2")  # 添加任务2到队列尾部
task_queue.append("Task 3")  # 添加任务3到队列尾部

# 执行任务队列中的任务
while task_queue:
    # 从队列的头部取出任务并执行, popleft()`: 移除并返回队列的最左端(头部)的元素
    current_task = task_queue.popleft()  # 从队列头部取出一个任务
    print("Executing task:", current_task)  # 执行任务

# 输出:
# Executing task: Task 1
# Executing task: Task 2
# Executing task: Task 3

--------

利用双端队列和集合数据结构实现了广度优先搜索

# 广度优先搜索(Breadth-First Search, BFS)算法函数
# 利用双端队列和集合数据结构实现了广度优先搜索的原理,按照逐层扩展探索的方式遍历整个图并输出访问顺序。
from collections import deque

def bfs(graph, start):
    # 使用集合存储已访问的节点,确保每个节点只被访问一次
    visited = set()
    
    # 使用双端队列(deque)来实现BFS的队列结构,从起始点开始探索
    queue = deque([start])
    
    # 将起始节点标记为已访问
    visited.add(start)
    
    # 当队列不为空时循环执行BFS
    while queue:
        # 从队列左侧取出顶点作为当前节点
        vertex = queue.popleft()
        
        # 打印当前节点,表示访问了该节点
        print(vertex)
        
        # 遍历当前节点的邻居节点
        for neighbor in graph[vertex] - visited:
            # 将未访问过的邻居节点加入已访问集合和队列中
            visited.add(neighbor)
            queue.append(neighbor)

# 定义图的邻接表结构
graph = {
    'A': {'B', 'C'},
    'B': {'A', 'D', 'E'},
    'C': {'A', 'F'},
    'D': {'B'},
    'E': {'B', 'F'},
    'F': {'C', 'E'}
}

# 从'A'节点开始执行广度优先搜索
bfs(graph, 'A')

你可能感兴趣的:(数据结构,python,开发语言)