python實(shí)現(xiàn)括號匹配的多種方法小結(jié)
一.方法1
在一些場景下會用到括號匹配的情況,通常用棧來實(shí)現(xiàn),通過棧和函數(shù)封裝來實(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):
# 向棧中加入元素,新的元素自動加入棧底
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() # 將前面定義的棧的類進(jìn)行實(shí)例化
class_equal = True # 定義初始匹配度為True
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)前字符串是')',且棧中沒有元素,說明不匹配
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
除了用棧外,也可以用邏輯判斷來實(shí)現(xiàn)綜合性的,第一種方式通過模擬棧的操作來檢查括號匹配情況,第二種方式在進(jìn)行一些基礎(chǔ)判斷后,同樣根據(jù)括號對應(yīng)關(guān)系來判斷匹配與否。
def check(row):
"""
check函數(shù) 用于檢查給定字符串中括號是否正確匹配(第一種實(shí)現(xiàn)方式)。
參數(shù) row: 待檢查括號匹配情況的字符串
"""
# 存儲左括號字符,用于第一種括號匹配實(shí)現(xiàn)方式
open_brackets = '([{<'
# 存儲右括號字符,用于第一種括號匹配實(shí)現(xiàn)方式
close_brackets = ')]}>'
# 映射左右括號的字典,便于第一種括號匹配實(shí)現(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)時沒有對應(yīng)的左括號,匹配錯誤
if len(stack) < 1:
label = False
break
# 判斷當(dāng)前右括號對應(yīng)的左括號是否與棧頂元素一致
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ù) 用于檢查給定字符串中括號是否正確匹配(第二種實(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:
# 判斷當(dāng)前閉括號與棧頂(tmp_list最后一個元素)對應(yīng)的開括號是否一致
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)方式的測試示例字符串
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)行括號匹配測試的結(jié)果:")
for row in rows:
print(f"字符串 '{row}' 的括號匹配結(jié)果:{check(row)}")
# 第二種實(shí)現(xiàn)方式的測試示例字符串
one_str_list = [
'({})',
'({[<《》>]})',
'[(]){}',
'{{{{{{',
'([{}])',
'}{[()]'
]
print("\n使用bracket_mathch函數(shù)進(jìn)行括號匹配測試的結(jié)果:")
for one_str in one_str_list:
print(f"字符串 '{one_str}' 的括號匹配結(jié)果:{bracket_mathch(one_str)}")
以上關(guān)于括號匹配的題,可能會出現(xiàn)在某些公司的面試題上,在當(dāng)時自己沒有寫過,只是寫了個算法思路,這會把之前的沒有做完的題整理優(yōu)化,給自己一個完美的交代.我始終認(rèn)為學(xué)習(xí)應(yīng)該是一種開源的百花齊放式的共贏,而且學(xué)無止境 當(dāng)然了共享和互惠是這個時代的趨勢主流.
到此這篇關(guān)于python實(shí)現(xiàn)括號匹配的多種方法小結(jié)的文章就介紹到這了,更多相關(guān)python括號匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決遇到:PytorchStreamReader failed reading zip&n
本文針對"PytorchStreamReaderfailedreadingziparchive:failedfindingcentral"錯誤提出解決方案,包括檢查文件完整性、文件路徑,嘗試更新PyTorch版本,檢查壓縮文件格式,代碼問題,或?qū)で蠹夹g(shù)支持等,希望這些經(jīng)驗(yàn)?zāi)芙o遇到同樣問題的人一個參考2024-09-09
python 遺傳算法求函數(shù)極值的實(shí)現(xiàn)代碼
今天小編就為大家分享一篇python 遺傳算法求函數(shù)極值的實(shí)現(xiàn)代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
利用Python實(shí)現(xiàn)數(shù)值積分的方法
這篇文章主要介紹了利用Python實(shí)現(xiàn)數(shù)值積分。本文主要用于對比使用Python來實(shí)現(xiàn)數(shù)學(xué)中積分的幾種計(jì)算方式,并和真值進(jìn)行對比,加深大家對積分運(yùn)算實(shí)現(xiàn)方式的理解2022-02-02
詳解python常用命令行選項(xiàng)與環(huán)境變量
這篇文章主要介紹了python常用命令行選項(xiàng)與環(huán)境變量,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02
使用Selenium在Python中實(shí)現(xiàn)錄屏功能
Selenium 是一個強(qiáng)大的用于自動化測試的工具,但你知道它也可以用來錄制瀏覽器操作的視頻嗎?本文將介紹如何使用 Selenium 在 Python 中實(shí)現(xiàn)錄屏功能,以便記錄和分享你的網(wǎng)頁操作過程,需要的朋友可以參考下2023-11-11
Python繪圖并標(biāo)記出指定點(diǎn)(最大值點(diǎn))方法實(shí)例
我們在用python畫散點(diǎn)圖的時候經(jīng)常會需要標(biāo)記出特定的點(diǎn),這篇文章主要給大家介紹了關(guān)于Python繪圖并標(biāo)記出指定點(diǎn)(最大值點(diǎn))的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
python實(shí)現(xiàn)批量壓縮指定目錄下的文件夾
這篇文章主要介紹了利用Python實(shí)現(xiàn)批量壓縮指定目錄下的文件夾的示例代碼,文中代碼示例講解詳細(xì),感興趣的小伙伴快跟隨小編一起動手試一試2023-08-08

