括號匹配演算法

2021-08-13 17:45:48 字數 728 閱讀 2599

​ 括號匹配在很多字串處理的場景中時常被用到,諸如各大ide括號不匹配的錯誤提示,編譯器編譯時檢查應該成對出現的括號是否符合要求等,在這裡我們就直接使用一種比較常規,但效率不差的方法去解決括號匹配的問題就行了。

​ 為了方便描述,對於需要做匹配的兩個符號,比如』(『和』)』,前者可稱為左側符號,後者可稱為右側符號。在做符號匹配時,如果以左側符號為標準,左側符號需要右側符號來完成匹配,但是由於諸如括號這類的符號可以做巢狀,所以左側符號之後既能有左側符號,也能有右側符號,處理起來很麻煩。以右側符號為標準就沒有這個問題了,每乙個右側符號都需要乙個左側符號來匹配,並且要求該右側符號之前最近的乙個符號必須是相匹配的左側符號,這樣處理起來就方便多了。

​ 利用棧可以很容易地解決這個問題,在遍歷字串時,若當前位置是右側符號,那它需要乙個該位置之前最近的乙個符號為左側符號,否則不匹配。定義乙個棧,用以記錄遍歷到當前位置時,所遇到的左側符號,處理方式是這樣的,每當遇到乙個右側符號時,檢查棧是否為空,若此時棧不為空,則對棧進行pop操作表明頂部元素已被匹配,否則為不匹配情況,直接返回false。當整個字串遍歷結束,我們就可以通過判斷該棧是否為空來判斷整個字串中的符號是否匹配。具體**如下:

bool is_match(const

string &str)

if (str[i] == ')') }}

if (!s.empty())

return

true;

}

括號匹配演算法

檢驗括號是否匹配的方法可以用 期待的急迫程度 這個概念來描述。例如,考慮下列括號序列 1 2 3 4 5 6 7 8 當計算機接受了第乙個括號後,它期待著與其匹配的第八個括號的出現,然而等來的卻是第二個括號,此時第乙個括號 只能暫時靠邊,而迫切等待與第二個括號相匹配的 第七個括號 的出現,類似地,因...

括號匹配演算法

題目 有一段字串,包含 和 和 中的一種或者多種,這三種括號出現次序不定,可隨意巢狀。編寫 判斷三種括號是否正確匹配。思路一 棧的思想 括號匹配是運用棧的經典思想。在 演算法中設定乙個空棧,每次讀入乙個括號,若是左括號,則壓入棧中,等到對應的右括號壓棧,若是右括號,能使置於棧頂的最急迫的期待得以消解...

驗證括號匹配 演算法

include include define maxsize 100 typedef structstack bool initstack stack s bool push stack s,char e bool pop stack s,char e bool gettop stack s,cha...