栈-括号匹配检验

版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/82938703

假设表达式中允许包括两种括号。圆括号与方括号,其嵌套的顺序随意,即([]()) 或 [([][])]等为正确的格式,[(]) 或 ([())或(()])均为不正确的格式。我们需要输入表达式,检验括号是否是匹配的。

运行结果:

思路:依次扫描各个符号,每遇到结束符都找到最近的符号来匹配,不匹配或者未找到就报错,最后应括号完全匹配完毕。

算法实现:

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

猜你喜欢

转载自blog.csdn.net/baidu_38304645/article/details/82938703