Python 棧(stack)
棧(stack)又名堆棧,它是一種運算受限的線性表
棧只能在一端進行插入和刪除操作,它按照先進后出(FILO)的原則存儲數據,先進入的數據被壓入棧底,最后的數據在棧頂
棧也可以看成是 FILO 的隊列 <- 點擊查看
操作
- 進棧
- 出棧
- 取棧頂
示例:
class Stack(object):
def __init__(self):
self.stack = []
def push(self, data):
"""
進棧函數
"""
self.stack.append(data)
def pop(self):
"""
出棧函數,
"""
return self.stack.pop()
def gettop(self):
"""
取棧頂
"""
return self.stack[-1]
應用
檢查括號
class Stack(object):
def __init__(self):
self.stack = []
def push(self, data):
"""
進棧函數
"""
self.stack.append(data)
def pop(self):
"""
出棧函數,
"""
return self.stack.pop()
def gettop(self):
"""
取棧頂
"""
return self.stack[-1]
def main(string):
stack = Stack()
check_dict = {
')': '(',
']': '[',
'}': '{'
}
for char in string:
if char in {'(', '[', '{'}:
stack.push(char)
elif char in {')', ']', '}'} and len(stack.stack) > 0:
if stack.gettop() == check_dict[char]:
stack.pop()
else:
return False
if len(stack.stack) == 0:
return True
else:
return False
print(main('{[()]}()[{()}]'))
迷宮問題
思路:從起點開始按照順序尋找路徑,通過棧記錄已經走過的路徑。如果最后發現不通就返回上一步,換個方向繼續尋找
深度優先
def find_path(x1, y1, x2, y2):
"""
運用棧尋找迷宮路徑
迷宮中 0 表示可以通過,1 表示無法通過,-1 表示已經走過的路
左上角坐標為 (0, 0),橫軸為 y 軸,縱軸為 x 軸
迷宮四周必須用 1 圍起來
:param int x1:起點 x 軸坐標
:param int y1:起點 y 軸坐標
:param int x2:終點 x 軸坐標
:param int y2:終點 y 軸坐標
:return: 是否找到出口
:rtype: bool
"""
paths = [lambda x, y: (x - 1, y), # 上
lambda x, y: (x, y + 1), # 右
lambda x, y: (x + 1, y), # 下
lambda x, y: (x, y - 1)] # 左
# 從起點進入迷宮
stack = list()
maze[x1][y1] = -1
stack.append((x1, y1))
while len(stack) > 0:
cur_node = stack[-1] # 當前位置
if cur_node[0] == x2 and cur_node[1] == y2:
# 到達終點
for p in stack:
print(p)
return True
for path in paths:
# 按照 dirs 順序尋找路徑
next_node = path(cur_node[0], cur_node[1])
if maze[next_node[0]][next_node[1]] == 0: # 如果可以走
stack.append(next_node)
maze[next_node[0]][next_node[1]] = -1 # 標記為已經走過,防止死循環
break
else: # 四個方向都沒找到
stack.pop() # 回溯
print("沒有出口")
return False
maze = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 0, 0, 1, 1, 0, 0, 1],
[1, 0, 1, 1, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 1, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 1, 1, 1, 0, 1, 1, 0, 1],
[1, 1, 0, 0, 0, 0, 0, 1, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
]
find_path(1, 1, 8, 8)
