棧(stack)又名堆棧,它是一種運算受限的線性表
棧只能在一端進行插入和刪除操做,它按照先進後出(FILO)的原則存儲數據,先進入的數據被壓入棧底,最後的數據在棧頂
棧也能夠當作是 FILO 的隊列 <- 點擊查看html
示例:node
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('{[()]}()[{()}]'))
思路:從起點開始按照順序尋找路徑,經過棧記錄已經走過的路徑。若是最後發現不通就返回上一步,換個方向繼續尋找
深度優先python
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)