括號匹配演算法

2021-07-23 15:40:17 字數 1977 閱讀 2666

題目:有一段字串,包含"("和")"、"["和"]"、""中的一種或者多種,這三種括號出現次序不定,可隨意巢狀。編寫**判斷三種括號是否正確匹配。

思路一(棧的思想):括號匹配是運用棧的經典思想。在

演算法中設定乙個空棧,每次讀入乙個括號,若是左括號,則壓入棧中,等到對應的右括號壓棧,

若是右括號,能使置於棧頂的最急迫的期待得以消解,此時將棧頂的左括號彈出,或者是不匹配的情況,判斷為不匹配。待演算法結束時,棧中應該為空,判斷為匹配。

前提說明:

順序表型別定義如下:

typedef struct 

sqlist;  // 順序表

stack是乙個已實現的棧。

可使用的相關型別和函式:

typedef char selemtype; // 棧stack的元素型別

status initstack(stack &s);

status push(stack &s, selemtype e);

status pop(stack &s, selemtype &e);

status stackempty(stack s);

status gettop(stack s, selemtype &e);

主要函式**:

1

status matchcheck(sqlist exp)2/*

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

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

15else

if(exp.elem[i]==')

')//若遇右圓括號,則嘗試匹配棧頂括號

16

23else

//匹配不成功

24

27}

28else

//棧為空,匹配不成功29

32}33else

if(exp.elem[i]=='}

')//若遇右花括號,則嘗試匹配棧頂括號

34

41else

//匹配不成功

42 45}

46else47

50}51else

if(exp.elem[i]==']

')//若遇右方括號,則嘗試匹配棧頂括號

52

59else

//匹配不成功

60 63}

64else65

68}69}

70if

(stackempty(s))

//當所有括號匹配成功時,棧應為空

7174

else

7578

}

以上本人參考他人**,深刻學習理解棧的思想與運用,如有錯誤請指出。

思路二(邏輯思想):從整體字串來看,符合括號匹配只要滿足兩個條件:(1)相同符號的左括號數與右括號的個數必須相同;(2)在字串的任意位置,相同符號的右括號個數必須小於等於左括號個數。兩個條件同時滿足時,必定匹配。

輸出結果:

本人能力有限,該方法為本人編寫,若有不足的地方,請指出。

括號匹配演算法

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

括號匹配演算法

括號匹配在很多字串處理的場景中時常被用到,諸如各大ide括號不匹配的錯誤提示,編譯器編譯時檢查應該成對出現的括號是否符合要求等,在這裡我們就直接使用一種比較常規,但效率不差的方法去解決括號匹配的問題就行了。為了方便描述,對於需要做匹配的兩個符號,比如 和 前者可稱為左側符號,後者可稱為右側符號。在做...

驗證括號匹配 演算法

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