最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實(shí)現(xiàn)括號(hào)匹配的多種方法小結(jié)

 更新時(shí)間:2024年12月18日 10:42:29   作者:大佬,救命!??!  
這篇文章主要為大家詳細(xì)介紹了python中實(shí)現(xiàn)括號(hào)匹配的三種方法,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下

一.方法1

在一些場(chǎng)景下會(huì)用到括號(hào)匹配的情況,通常用棧來(lái)實(shí)現(xiàn),通過(guò)棧和函數(shù)封裝來(lái)實(shí)現(xiàn)

class Stack:
    def __init__(self):
        # 我們定義空列表,實(shí)現(xiàn)棧的進(jìn)入進(jìn)出操作
        self.items = []
 
    def isEmpty(self):
        # 判斷是否為空棧
        return self.items == []
 
    def push(self, item):
        # 向棧中加入元素,新的元素自動(dòng)加入棧底
        self.items.append(item)
 
    def pop(self):
        # 移出棧頂元素。
        return self.items.pop()
 
    def peek(self):
        # 返回棧頂元素
        return self.items[len(self.items) - 1]
 
    def size(self):
        # 返回棧的長(zhǎng)度
        return len(self.items)
 
 
# 定義一個(gè)函數(shù),用來(lái)檢測(cè)括號(hào)是否匹配
def check(string):
    s = Stack()  # 將前面定義的棧的類(lèi)進(jìn)行實(shí)例化
    class_equal = True  # 定義初始匹配度為T(mén)rue
    index = 0
    while index < len(string) and class_equal:
        test_str = string[index]
        # 當(dāng)字符串是‘(',則壓入棧中
        if test_str == '(':
            s.push(test_str)
        else:
            # 如果當(dāng)前字符串是')',且棧中沒(méi)有元素,說(shuō)明不匹配
            if s.isEmpty():
                class_equal = False
            else:
                # 如果棧不為空,那么去掉一個(gè)棧中的'(',表示有一對(duì)括號(hào)已匹配
                s.pop()
        index += 1
 
    if class_equal and s.isEmpty():
        return '所有括號(hào)匹配'
    else:
        return '不匹配'
 
 
print(check('((()))'))
print(check('()()))'))

二.方法2

加入一些自主的輸入使得變得更加的自由,有了參與感

class Stack:
    def __init__(self):
        self.items = []  # 使用列表來(lái)存儲(chǔ)棧中的元素
 
    def push(self, item):
        self.items.append(item)  # 將元素壓入棧頂
 
    def pop(self):
        if not self.is_empty():
            return self.items.pop()  # 彈出棧頂元素
        else:
            raise IndexError("pop from empty stack")
 
    def peek(self):
        if not self.is_empty():
            return self.items[-1]  # 返回棧頂元素,但不彈出
        else:
            return None
 
    def is_empty(self):
        return len(self.items) == 0  # 檢查棧是否為空
 
    def size(self):
        return len(self.items)  # 返回棧中元素的個(gè)數(shù)
 
 
def is_valid(expression, stack):
    mapping = {'{': '}', '[': ']', '(': ')'}
    for char in expression:
        # 判斷是否為左括號(hào)
        if char in mapping.keys():
            stack.push(char)
        elif char in mapping.values():  # 判斷是否為右括號(hào)
            if stack.is_empty() == False and mapping[stack.peek()] == char:
                stack.pop()
            else:
                return False
        else:
            continue
 
    return stack.size() == 0
 
 
expression = input("請(qǐng)輸入包含括號(hào)的一系列字符串:\n")
 
stack = Stack()
 
if is_valid(expression, stack):
    print("括號(hào)匹配成功")
else:
    print("括號(hào)匹配失敗")

三.方法3

除了用棧外,也可以用邏輯判斷來(lái)實(shí)現(xiàn)綜合性的,第一種方式通過(guò)模擬棧的操作來(lái)檢查括號(hào)匹配情況,第二種方式在進(jìn)行一些基礎(chǔ)判斷后,同樣根據(jù)括號(hào)對(duì)應(yīng)關(guān)系來(lái)判斷匹配與否。

def check(row):
    """
    check函數(shù) 用于檢查給定字符串中括號(hào)是否正確匹配(第一種實(shí)現(xiàn)方式)。
    參數(shù) row: 待檢查括號(hào)匹配情況的字符串
    """
    # 存儲(chǔ)左括號(hào)字符,用于第一種括號(hào)匹配實(shí)現(xiàn)方式
    open_brackets = '([{<'
    # 存儲(chǔ)右括號(hào)字符,用于第一種括號(hào)匹配實(shí)現(xiàn)方式
    close_brackets = ')]}>'
    # 映射左右括號(hào)的字典,便于第一種括號(hào)匹配實(shí)現(xiàn)方式中出棧判斷
    brackets_map = {')': '(', ']': '[', '}': '{', '>': '<'}
 
    stack = []
    label = True
    for char in row:
        # 如果字符是左括號(hào),將其加入棧(用列表模擬棧)
        if char in open_brackets:
            stack.append(char)
        elif char in close_brackets:
            # 如果棧為空,說(shuō)明右括號(hào)出現(xiàn)時(shí)沒(méi)有對(duì)應(yīng)的左括號(hào),匹配錯(cuò)誤
            if len(stack) < 1:
                label = False
                break
            # 判斷當(dāng)前右括號(hào)對(duì)應(yīng)的左括號(hào)是否與棧頂元素一致
            elif brackets_map[char] == stack[-1]:
                stack.pop()
            else:
                label = False
                break
        else:
            continue
    # 如果最后棧不為空,說(shuō)明還有未匹配的左括號(hào),匹配錯(cuò)誤
    if stack!= []:
        label = False
    return label
 
 
def bracket_mathch(one_str):
    """
    bracket_mathch函數(shù) 用于檢查給定字符串中括號(hào)是否正確匹配(第二種實(shí)現(xiàn)方式)。
    參數(shù) one_str: 待檢查括號(hào)匹配情況的字符串
    """
    tmp_list = []
    open_bracket_list = ['(', '[', '{', '<', '《']
    close_bracket_list = [')', ']', '}', '>', '》']
    one_str_list = list(one_str)
    length = len(one_str_list)
    set_list = list(set(one_str_list))
    num_list = [one_str_list.count(one) for one in set_list]
    # 如果字符串首字符是閉括號(hào),直接判定括號(hào)匹配錯(cuò)誤
    if one_str[0] in close_bracket_list:
        return False
    # 如果字符串長(zhǎng)度不是偶數(shù),直接判定括號(hào)匹配錯(cuò)誤
    elif length % 2!= 0:
        return False
    # 如果去重后的字符列表長(zhǎng)度不是偶數(shù),直接判定括號(hào)匹配錯(cuò)誤
    elif len(set_list) % 2!= 0:
        return False
    else:
        for i in range(length):
            if one_str[i] in open_bracket_list:
                tmp_list.append(one_str[i])
            elif one_str[i] in close_bracket_list:
                # 判斷當(dāng)前閉括號(hào)與棧頂(tmp_list最后一個(gè)元素)對(duì)應(yīng)的開(kāi)括號(hào)是否一致
                if close_bracket_list.index(one_str[i]) == open_bracket_list.index(tmp_list[-1]):
                    tmp_list.pop()
                else:
                    return False
                break
    return True
 
 
if __name__ == '__main__':
 
    # 第一種實(shí)現(xiàn)方式的測(cè)試示例字符串
    rows = [
        '([<^>x[ ]{a}]{/}{t}g<^>)<{x}b>{x}<z({%}w >[b][c[c]]{{h}}',
        '[/]{((x)({{}}w)w){f}{v}[%(1{u}{ })([[ ]-]h)]{c}(*)[y]}',
        '<<(^)z>>[b]< >[[?u[v]{z<b< >>}]g]/b[(])v(v)(+)',
        '[[b]][(v)g]([{{<->+}e}[*]d<+>]g[[a] <+>(v)]){a}[u]'
    ]
    print("使用check函數(shù)進(jìn)行括號(hào)匹配測(cè)試的結(jié)果:")
    for row in rows:
        print(f"字符串 '{row}' 的括號(hào)匹配結(jié)果:{check(row)}")
 
    # 第二種實(shí)現(xiàn)方式的測(cè)試示例字符串
    one_str_list = [
        '({})',
        '({[<《》>]})',
        '[(]){}',
        '{{{{{{',
        '([{}])',
        '}{[()]'
    ]
    print("\n使用bracket_mathch函數(shù)進(jìn)行括號(hào)匹配測(cè)試的結(jié)果:")
    for one_str in one_str_list:
        print(f"字符串 '{one_str}' 的括號(hào)匹配結(jié)果:{bracket_mathch(one_str)}")

以上關(guān)于括號(hào)匹配的題,可能會(huì)出現(xiàn)在某些公司的面試題上,在當(dāng)時(shí)自己沒(méi)有寫(xiě)過(guò),只是寫(xiě)了個(gè)算法思路,這會(huì)把之前的沒(méi)有做完的題整理優(yōu)化,給自己一個(gè)完美的交代.我始終認(rèn)為學(xué)習(xí)應(yīng)該是一種開(kāi)源的百花齊放式的共贏,而且學(xué)無(wú)止境 當(dāng)然了共享和互惠是這個(gè)時(shí)代的趨勢(shì)主流.

到此這篇關(guān)于python實(shí)現(xiàn)括號(hào)匹配的多種方法小結(jié)的文章就介紹到這了,更多相關(guān)python括號(hào)匹配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python中的type,元類(lèi),類(lèi),對(duì)象用法

    python中的type,元類(lèi),類(lèi),對(duì)象用法

    這篇文章主要介紹了python中的type,元類(lèi),類(lèi),對(duì)象用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python利用遞歸和walk()遍歷目錄文件的方法示例

    Python利用遞歸和walk()遍歷目錄文件的方法示例

    在日常開(kāi)發(fā)中經(jīng)常需要檢查一個(gè)“目錄或文件夾”內(nèi)部有沒(méi)有我們想要的文件或者文件夾,下面這篇文章主要給大家介紹了關(guān)于Python利用遞歸和walk()遍歷目錄文件的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-07-07
  • Python創(chuàng)建系統(tǒng)目錄的方法

    Python創(chuàng)建系統(tǒng)目錄的方法

    這篇文章主要介紹了Python創(chuàng)建系統(tǒng)目錄的方法,實(shí)例分析了Python操作目錄的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • Python?Pandas?中的數(shù)據(jù)結(jié)構(gòu)詳解

    Python?Pandas?中的數(shù)據(jù)結(jié)構(gòu)詳解

    這篇文章主要介紹了Python?Pandas?中的數(shù)據(jù)結(jié)構(gòu)詳解,Pandas有三種數(shù)據(jù)結(jié)構(gòu)Series、DataFrame和Panel,文章圍繞主題展開(kāi)更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-06-06
  • Pyinstaller將py打包成exe的實(shí)例

    Pyinstaller將py打包成exe的實(shí)例

    下面小編就為大家分享一篇Pyinstaller將py打包成exe的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • python 控制Asterisk AMI接口外呼電話的例子

    python 控制Asterisk AMI接口外呼電話的例子

    今天小編就為大家分享一篇python 控制Asterisk AMI接口外呼電話的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Python中的裝飾器鏈(decorator chain)詳解

    Python中的裝飾器鏈(decorator chain)詳解

    在Python中,裝飾器是一種高級(jí)功能,它允許你在不修改函數(shù)或類(lèi)代碼的情況下,為它們添加額外的功能,裝飾器通常用于日志記錄、性能測(cè)量、權(quán)限檢查等場(chǎng)景,當(dāng)多個(gè)裝飾器應(yīng)用于同一個(gè)函數(shù)或類(lèi)時(shí),形成裝飾器鏈,這篇文章主要介紹了Python中的裝飾器鏈詳解,需要的朋友可以參考下
    2024-06-06
  • pycharm自動(dòng)生成文件注釋和函數(shù)注釋

    pycharm自動(dòng)生成文件注釋和函數(shù)注釋

    這篇文章主要介紹了pycharm自動(dòng)生成文件注釋和函數(shù)注釋的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • pandas的to_datetime時(shí)間轉(zhuǎn)換使用及學(xué)習(xí)心得

    pandas的to_datetime時(shí)間轉(zhuǎn)換使用及學(xué)習(xí)心得

    這篇文章主要給大家介紹了關(guān)于pandas的to_datetime時(shí)間轉(zhuǎn)換使用及學(xué)習(xí)心得的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用pandas具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • PyQt實(shí)現(xiàn)計(jì)數(shù)器的方法示例

    PyQt實(shí)現(xiàn)計(jì)數(shù)器的方法示例

    這篇文章主要介紹了PyQt實(shí)現(xiàn)計(jì)數(shù)器的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評(píng)論

阿瓦提县| 枣强县| 仁寿县| 上林县| 萝北县| 大兴区| 怀来县| 晋州市| 新余市| 慈利县| 巢湖市| 连山| 宁夏| 彩票| 莒南县| 平安县| 禹州市| 通州区| 乐东| 米泉市| 三原县| 唐海县| 鄂州市| 揭西县| 栾城县| 兴安盟| 广东省| 梅州市| 曲水县| 西贡区| 外汇| 平遥县| 通江县| 嘉黎县| 长子县| 东丽区| 米脂县| 九寨沟县| 恩施市| 富顺县| 公主岭市|