1樓:vzit
寫過乙個Python的lisp直譯器,括號匹配的原理就是遞迴堆疊,如果讀到最後沒有釋放就說明括號不匹配,時間複雜度為O(n)。
2樓:彭泉鑫
# 符號表
SYMBOLS='
:'SYMBOLS_L
,SYMBOLS_R
=SYMBOLS
.values
(),SYMBOLS
.keys
()def
check(s
):arr=
forcins
:ifcin
SYMBOLS_L
:# 左符號入棧
arr.(c
)elifcin
SYMBOLS_R
:# 右符號要麼出棧,要麼匹配失敗
ifarr
andarr[-
1]==SYMBOLS[c
]:arr
.pop
()else
:return
False
return
notarr
(check
("3 * "
(check
("3 * ]"))
3樓:靈劍
match_brackets(s
,i):'''
try to match brackets in string s from position i.
return next start position if succeeded, raise ValueError if failed
'''ifs[
i]=='('
:end_bracket
=')'
elifs[
i]=='['
:end_bracket
=']'
elifs[
i]==''
elifs[
i]=='<'
:end_bracket
='>'
# Introduce this for start-end match
else
:raise
ValueError
('Not match')i
+=1while
True:if
s[i]
==end_bracket
:returni+
1else:i
=match_brackets(s
,i)def
is_match(s
):try:s
=''.join(c
forcins
ifcin(
'(',
'[','',
']',
')'))
match_brackets
('<'+s
+'>',0
)except
ValueError
:return
False
else
:return
True
is_match(ལ
)is_match
('3 * ]'
)過程呼叫和棧密切相關,進行一次遞迴呼叫就是一次進棧,進行一次返回就是一次出棧,過程中使用的臨時變數就是棧中儲存的資料,因此也不難將這個遞迴程式改寫成使用棧的程式了
4樓:石頭三顆
用list的pop(),差不多就能完成你的需求了。
我第一次聽說棧也被嚇了一條,後來一聽概念就很容易懂了,就是乙個「先進後出,後進先出」的業務邏輯,類似手槍彈夾:
第一顆被裝到彈夾裡面的子彈,是最後一顆打出來的。a='3 * '
def test(strexpchecki = 0i += 1if err == 1space = ' ' * iprint('\n錯誤:\n{}\n{}↑ 這個括號不合法.'.
format(strexp,space))
elseprint('{},表示式合法。'.format(strexptest(a)
執行效果如下:
如何進行括號匹配
可以寫成動規 DP i j 指的是當計算到字串第i個字元 Input i 1 且左括號比右括號多j個時可能的序列個數。邊界條件DP 0 0 1,DP i 1 DP i j DP 0 k 0 i j,k 0 以下演算法是O n 2 的,不知道可不可以進一步優化。因為題目只要求輸出結果的個數,就不一一打...
用正規表示式匹配非括號內的資料
蒼爾貓鹿 js實現如下 varreg g var source cc while result reg exec source 將括號作為邊界,括號之間的內容作為第乙個分組,用全域性匹配模式,迴圈匹配,每次匹配得到乙個陣列,其中下標為1的即為第乙個分組,也就是括號之間的內容。 梁濤 解法一如果你用的...
Python 我這個正規表示式怎麼匹配不上?
Emrys 猜測一下,題主想要刪掉所有 Python 語句的輸出 如果不是請更新題目描述 只需要用下面的正規表示式即可 importres class A pass a A a.dict a.test test a.dict getattr a,test test a.abc Traceback m...