队列 queue
特点:FIFO(first input ,first output),从队头删除元素,在队尾加入元素
queue=[] #初始化队列----列表
#向空队列加入元素
queue.append("A")
queue.append("B")
queue.append("C")
print(queue)
#从队列弹出(删除)元素
queue.pop(0) #从队列弹出队头元素
print(queue)
queue.pop() #从队列弹出队末元素
print(queue)
结果:
['A', 'B', 'C']
['B', 'C']
['B']
堆栈 stack
特点:先进后出
stack=[] #初始化栈---列表
#向栈中加入元素
stack.append("A")
stack.append("B")
stack.append("C")
print(stack)
#从栈中弹出(删除)元素
stack.pop() #从栈中弹出(最上面)元素
print(stack)
结果:
['A', 'B', 'C']
['A', 'B']
BFS—广度优先搜索
graph={
"A": ["B","C"],
"B": ["A","C","D"],
"C": ["A","B","D","E"],
"D": ["B","C","E","F"],
"E": ["C","D"],
"F": ["D"]
}
def BFS(graph,s):
"""
:param graph: 输入的图
:param s: BFS的起始点
:return: NONE
"""
queue=[] #用队列来保持层的顺序
queue.append(s) #先把起始点入队
#创建一个空集合---visited:代表已经遍历过的点
visited=set() #set():创建一个空集合
visited.add(s) #把初始点放入集合中 --- {'A'}
#只要队列没空,就要一直遍历下去,直到将所有的点都遍历(pop)完
while len(queue)>0: #while queue
vertex=queue.pop(0) #把队头元素pop掉,pop出来的元素为vertex,eg:"A"
nodes=graph[vertex] #nodes是key--vertex "A"对应的value--对应的列表["B","C"]
for w in nodes: #遍历nodes
if w not in visited: #如果nodes里的是没被遍历过的
queue.append(w) #那么就在队列后面加上
visited.add(w)
print(vertex)
BFS(graph,"A")
结果:
A
B
C
D
E
F
DFS—深度优先搜索
graph={
"A": ["B","C"],
"B": ["A","C","D"],
"C": ["A","B","D","E"],
"D": ["B","C","E","F"],
"E": ["C","D"],
"F": ["D"]
}
def DFS(graph,s):
"""
:param graph: 输入的图
:param s: BFS的起始点
:return: NONE
"""
stack=[] #用队列来保持层的顺序
stack.append(s) #先把起始点入栈
#创建一个空集合---visited:代表已经遍历过的点
visited=set() #set():创建一个空集合
visited.add(s) #把初始点放入集合中 --- {'A'}
#只要栈没空,就要一直遍历下去,直到将所有的点都遍历(pop)完
while len(stack)>0: #while stack
vertex=stack.pop() #把栈顶元素pop掉,pop出来的元素为vertex,eg:"A"
nodes=graph[vertex] #nodes是key--vertex "A"对应的value--对应的列表["B","C"]
for w in nodes: #遍历nodes
if w not in visited: #如果nodes里的是没被遍历过的
stack.append(w) #那么就入栈
visited.add(w)
print(vertex)
DFS(graph,"A")
结果:
A
C
E
D
F
B