題目:有一段字串,包含"("和")"、"["和"]"、""中的一種或者多種,這三種括號出現次序不定,可隨意巢狀。編寫**判斷三種括號是否正確匹配。
思路一(棧的思想):括號匹配是運用棧的經典思想。在
演算法中設定乙個空棧,每次讀入乙個括號,若是左括號,則壓入棧中,等到對應的右括號壓棧,
若是右括號,能使置於棧頂的最急迫的期待得以消解,此時將棧頂的左括號彈出,或者是不匹配的情況,判斷為不匹配。待演算法結束時,棧中應該為空,判斷為匹配。
前提說明:
順序表型別定義如下:
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...