Python 棧(stack)

Python 棧(stack)

棧(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)
相關文章
相關標籤/搜索