栈结构具有“后进先出”特性,会有比较大的作用。
问题:设表达式中包含三种括号:圆括号,方括号和花括号,他们可以互相嵌套,如(【{}】(【】))为正确格式,而{【】})},{【()均为不正确的格式。
分析:
1.一个栈,每读入一个人括号,若是左括号则直接入栈1.可以设置,等待相匹配的同类右括号,且与当前栈顶的左括号同类型,则二者匹配,将栈顶的左括号出栈,否则属于不合法情况。
2.如果输入的序列已读完,而栈中仍有等待匹配的左括号,或者读入了一个右括号,而栈中已经没有同类型左括号,都是不合法的。
3.当输入序列和栈同时变为空时,说明所有括号完全匹配。
void BracketMatch(char *str){
/*str[]中为输入的字符串,利用堆栈技术来检查该字符串中的括号是否匹配*/
Stack S;int i;char ch;
InitStack(&S);//栈的初始化
for(i=0;str[i]!='\0';i++){
switch(str[i]){
case '(':
case '[':
case '{':
push(&S,str[i]);break;//进栈
case ')':
case ']':
case '}':
if(IsEmpty(&S))//判断栈是否为空,如果为空则返回true
{printf("\n右括号多余");
return;
}
else{
GetTop(&S,&ch)//将S栈中的左括号取出
if(Match(ch,str[i]))//判断是否匹配
Pop(&S,&ch)//已匹配的左括号出栈
else{printf("\n对应的左右括号不同类!");
return;
}
}
}/*switch*/
}/*for*/
if(IsEmpty(S))printf("括号匹配");
else printf("左括号多余")
}