python 括號檢測是否匹配?

時間 2021-05-31 13:49:34

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

print

(check

("3 * "

))print

(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...