欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python實現(xiàn)括號匹配的多種方法小結

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

一.方法1

在一些場景下會用到括號匹配的情況,通常用棧來實現(xiàn),通過棧和函數(shù)封裝來實現(xiàn)

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

二.方法2

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

class Stack:
    def __init__(self):
        self.items = []  # 使用列表來存儲棧中的元素
 
    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)  # 返回棧中元素的個數(shù)
 
 
def is_valid(expression, stack):
    mapping = {'{': '}', '[': ']', '(': ')'}
    for char in expression:
        # 判斷是否為左括號
        if char in mapping.keys():
            stack.push(char)
        elif char in mapping.values():  # 判斷是否為右括號
            if stack.is_empty() == False and mapping[stack.peek()] == char:
                stack.pop()
            else:
                return False
        else:
            continue
 
    return stack.size() == 0
 
 
expression = input("請輸入包含括號的一系列字符串:\n")
 
stack = Stack()
 
if is_valid(expression, stack):
    print("括號匹配成功")
else:
    print("括號匹配失敗")

三.方法3

除了用棧外,也可以用邏輯判斷來實現(xiàn)綜合性的,第一種方式通過模擬棧的操作來檢查括號匹配情況,第二種方式在進行一些基礎判斷后,同樣根據(jù)括號對應關系來判斷匹配與否。

def check(row):
    """
    check函數(shù) 用于檢查給定字符串中括號是否正確匹配(第一種實現(xiàn)方式)。
    參數(shù) row: 待檢查括號匹配情況的字符串
    """
    # 存儲左括號字符,用于第一種括號匹配實現(xiàn)方式
    open_brackets = '([{<'
    # 存儲右括號字符,用于第一種括號匹配實現(xiàn)方式
    close_brackets = ')]}>'
    # 映射左右括號的字典,便于第一種括號匹配實現(xiàn)方式中出棧判斷
    brackets_map = {')': '(', ']': '[', '}': '{', '>': '<'}
 
    stack = []
    label = True
    for char in row:
        # 如果字符是左括號,將其加入棧(用列表模擬棧)
        if char in open_brackets:
            stack.append(char)
        elif char in close_brackets:
            # 如果棧為空,說明右括號出現(xiàn)時沒有對應的左括號,匹配錯誤
            if len(stack) < 1:
                label = False
                break
            # 判斷當前右括號對應的左括號是否與棧頂元素一致
            elif brackets_map[char] == stack[-1]:
                stack.pop()
            else:
                label = False
                break
        else:
            continue
    # 如果最后棧不為空,說明還有未匹配的左括號,匹配錯誤
    if stack!= []:
        label = False
    return label
 
 
def bracket_mathch(one_str):
    """
    bracket_mathch函數(shù) 用于檢查給定字符串中括號是否正確匹配(第二種實現(xiàn)方式)。
    參數(shù) one_str: 待檢查括號匹配情況的字符串
    """
    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]
    # 如果字符串首字符是閉括號,直接判定括號匹配錯誤
    if one_str[0] in close_bracket_list:
        return False
    # 如果字符串長度不是偶數(shù),直接判定括號匹配錯誤
    elif length % 2!= 0:
        return False
    # 如果去重后的字符列表長度不是偶數(shù),直接判定括號匹配錯誤
    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:
                # 判斷當前閉括號與棧頂(tmp_list最后一個元素)對應的開括號是否一致
                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__':
 
    # 第一種實現(xiàn)方式的測試示例字符串
    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ù)進行括號匹配測試的結果:")
    for row in rows:
        print(f"字符串 '{row}' 的括號匹配結果:{check(row)}")
 
    # 第二種實現(xiàn)方式的測試示例字符串
    one_str_list = [
        '({})',
        '({[<《》>]})',
        '[(]){}',
        '{{{{{{',
        '([{}])',
        '}{[()]'
    ]
    print("\n使用bracket_mathch函數(shù)進行括號匹配測試的結果:")
    for one_str in one_str_list:
        print(f"字符串 '{one_str}' 的括號匹配結果:{bracket_mathch(one_str)}")

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

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

相關文章

  • 解決遇到:PytorchStreamReader failed reading zip archive:failed finding central錯誤問題

    解決遇到:PytorchStreamReader failed reading zip&n

    本文針對"PytorchStreamReaderfailedreadingziparchive:failedfindingcentral"錯誤提出解決方案,包括檢查文件完整性、文件路徑,嘗試更新PyTorch版本,檢查壓縮文件格式,代碼問題,或?qū)で蠹夹g支持等,希望這些經(jīng)驗能給遇到同樣問題的人一個參考
    2024-09-09
  • python 遺傳算法求函數(shù)極值的實現(xiàn)代碼

    python 遺傳算法求函數(shù)極值的實現(xiàn)代碼

    今天小編就為大家分享一篇python 遺傳算法求函數(shù)極值的實現(xiàn)代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python基于property()函數(shù)定義屬性

    python基于property()函數(shù)定義屬性

    這篇文章主要介紹了python基于property()函數(shù)定義屬性,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • 利用Python實現(xiàn)數(shù)值積分的方法

    利用Python實現(xiàn)數(shù)值積分的方法

    這篇文章主要介紹了利用Python實現(xiàn)數(shù)值積分。本文主要用于對比使用Python來實現(xiàn)數(shù)學中積分的幾種計算方式,并和真值進行對比,加深大家對積分運算實現(xiàn)方式的理解
    2022-02-02
  • 詳解python常用命令行選項與環(huán)境變量

    詳解python常用命令行選項與環(huán)境變量

    這篇文章主要介紹了python常用命令行選項與環(huán)境變量,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • 使用Selenium在Python中實現(xiàn)錄屏功能

    使用Selenium在Python中實現(xiàn)錄屏功能

    Selenium 是一個強大的用于自動化測試的工具,但你知道它也可以用來錄制瀏覽器操作的視頻嗎?本文將介紹如何使用 Selenium 在 Python 中實現(xiàn)錄屏功能,以便記錄和分享你的網(wǎng)頁操作過程,需要的朋友可以參考下
    2023-11-11
  • python裝飾器的特性原理詳解

    python裝飾器的特性原理詳解

    這篇文章主要介紹了python裝飾器的特性原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Python繪圖并標記出指定點(最大值點)方法實例

    Python繪圖并標記出指定點(最大值點)方法實例

    我們在用python畫散點圖的時候經(jīng)常會需要標記出特定的點,這篇文章主要給大家介紹了關于Python繪圖并標記出指定點(最大值點)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • python實現(xiàn)批量壓縮指定目錄下的文件夾

    python實現(xiàn)批量壓縮指定目錄下的文件夾

    這篇文章主要介紹了利用Python實現(xiàn)批量壓縮指定目錄下的文件夾的示例代碼,文中代碼示例講解詳細,感興趣的小伙伴快跟隨小編一起動手試一試
    2023-08-08
  • Python同時迭代多個序列的方法

    Python同時迭代多個序列的方法

    這篇文章主要介紹了Python同時迭代多個序列的方法,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07

最新評論