括號匹配的檢驗

2021-07-28 13:29:58 字數 1472 閱讀 1385

一、       題目

假設表示式中可以允許包含三種括號:圓括號"("和")",方括號"["和"]"和花括號"",且這三種括號可按任意的次序巢狀使用。即(())或者()等為正確格式,[{}]或者均為不正確的格式。編寫判別給定表示式中所含括號是否正確配對出現的演算法。

二、       思路

檢驗括號是否匹配的方法可以用「期待的急迫程度」這個概念來描述。例如,考慮下列括號序列:

[ ( [ ] [ ] ) ]

1 2 3 4 5 6 7 8

當計算機接受了第乙個括號後,它期待著與其匹配的第八個括號的出現,然而等來的卻是第二個括號,此時第乙個括號「[」只能暫時靠邊,而迫切等待與第二個括號相匹配的、第七個括號「)」的出現,類似地,因等來的是第三個括號「[」,其期待匹配的程度較第二個括號更急迫,則第二個括號也只能靠邊,讓位於第三個括號,顯然第二個括號的期待急迫性高於第乙個括號;在接受了第四個括號之後,第三個括號的期待得到滿足,消解之後,第二個括號的期待匹配就成為當前最急迫的任務了,……依此類推。

由上述描述可知,這個處理過程和棧的特點非常吻合,因此,我們可以用棧來解決這個問題。

解決思路:

1.在演算法中設定乙個棧,每次讀入乙個符號;

2.若是左符號,則作為乙個新的更急迫的期待壓入棧中,自然使原有的在棧中的所有未消解的期待的急迫性都降低一級;

3.若是符號為右符號,如果使置於棧頂的最急迫的期待得以消解,此時將棧頂的符號彈出;

4.若是符號為右符號,沒有使置於棧頂的最急迫的期待的一消解,則直接返回false;

5.在演算法的開始和結束時,棧應該為空,此時返回true。

三、       **展示

已知:

stack是乙個已實現的棧。

bool initstack(stack &s);

bool push(stack &s, char e);

bool pop(stack &s, char &e);

bool stackempty(stack s);

bool gettop(stack s, char &e);

bool matchcheck(char *p_pelem, const int p_nelemsize)

/* 順序表exp表示表示式; */

/* 若exp中的括號配對,則返回true,否則返回false */

{ if (null == p_pelem)

return false;

stack s;

char e;

bool bret = false;

//逐個讀入括號

for(int i=0;i

一、說明

題目及解題思路來自於嚴蔚敏老師的《資料結構》一書,本文僅僅將思路用**實現。

8586 括號匹配檢驗

今天把資料結構學習的 拿出來和分享一下,應該測試能過!8586 括號匹配檢驗 time limit 1000ms memory limit 1000k total submit 679 accepted 182 type program language not limited descriptio...

C 括號匹配的檢驗

假設表示式中包含三種括號,其巢狀順序任意,即 為正確格式,為不正確的格式,檢查括號是否匹配,基於c 實現,使用stl實現的stack進行實現 include include include include void matchbrackets const std string brackets in...

括號匹配的檢驗(棧)

include using namespace std include include define ture 1 define false 0 define ok 1 define error 0 define overflow 2 typedef int status typedef char ...