棧-括號匹配檢驗
阿新 • • 發佈:2018-12-13
假設表示式中允許包括兩種括號。圓括號與方括號,其巢狀的順序隨意,即([]()) 或 [([][])]等為正確的格式,[(]) 或 ([())或(()])均為不正確的格式。我們需要輸入表示式,檢驗括號是否是匹配的。
執行結果:
思路:依次掃描各個符號,每遇到結束符都找到最近的符號來匹配,不匹配或者未找到就報錯,最後應括號完全匹配完畢。
演算法實現:
Status Match(char *exp){ //括號匹配檢驗 //依次掃描各個符號,每遇到結束符都找最近的符號來匹配, //不匹配或者未找到就報錯,最後應括號完全匹配畢 SqStack<char> S; char e; InitStack(S); //初始化一個空棧 int HasErr=0,i=0; while(exp[i]!='\0'&&!HasErr){ //逐個掃描符號 switch(exp[i]){ case '(': case '[': case '{': Push(S,exp[i]); break; case ')': if(StackEmpty(S)) //如果棧空則報錯 HasErr=1; else{ Pop(S,e);//否則出棧 if(e!='(')//彈出元素與當前元素不匹配,報錯 HasErr=1; } break;//否則無動作,掃描符號 case '}': if(StackEmpty(S)) HasErr=1; else{ Pop(S,e); if(e!='{') HasErr=1; } break; case ']': if(StackEmpty(S)) HasErr=1; else{ Pop(S,e); if(e!='[') HasErr=1; } break; } i++; } if(HasErr||!StackEmpty(S)) //若有錯或者不是空棧就不匹配 return FALSE; return TRUE;//否則匹配 }