1. 程式人生 > >棧-括號匹配檢驗

棧-括號匹配檢驗

假設表示式中允許包括兩種括號。圓括號與方括號,其巢狀的順序隨意,即([]()) 或 [([][])]等為正確的格式,[(]) 或 ([())或(()])均為不正確的格式。我們需要輸入表示式,檢驗括號是否是匹配的。

執行結果:

思路:依次掃描各個符號,每遇到結束符都找到最近的符號來匹配,不匹配或者未找到就報錯,最後應括號完全匹配完畢。

演算法實現:

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;//否則匹配
}