利用栈的特性判断括号是否匹配
括号匹配的检验:假设输入字符串中有三种括号,大括号、中括号、小括号,其嵌套的方式是随意的。
即类似的都为正确格式。
检验括号是否匹配的方法可用“期待的急迫程度”来解决。例如下面的括号串:
当计算机接受第一个括号时,它期待着第六个括号与它见面,然而我们输入的却是第二个括号,同理,一直到第三个括号,3期待着4与它见面,恰好我们下一个输入的便是4号括号,3和4满足,抬走。
之后第二个括号的期待就是最急迫的了,以此类推,直到出现不匹配的括号或者所有括号均找到了其对应的另一半。
所以,在算法中设置一个栈,每读入一个左括号,压入栈中。或者读入一个右括号,若栈不为空,则从栈中取出括号来匹配;若为空,很明显,括号不匹配。
此外,为了应对
前面都匹配,最后一个不匹配的情况,最后还需要判断栈是否为空,因为匹配的话,左括号都被取完了,右括号我们没有压栈。所以栈一定是空的。
下面为代码的主要部分。
int main() { ElemType c = '0'; sqStack s; int ofo = -1;//用来标记是否匹配 printf("请输入你要检查的字符串(以@表示结束):\n"); InitStack(&s);//创建一个栈 //printf("%d", stackLen(s)); while(c != '@') { scanf("%c", &c); if(c == '{' || c == '[' || c == '(') Push(&s, c); if(c == '}' ||c == ']' || c == ')') { if (stackLen(s) == 0) { //printf("stacklen : %d\n", stackLen(s)); ofo = 0;//不匹配 break; } else { char cl = '0'; pop(&s, &cl); if((cl == '(' && c == ')') || (cl == '[' && c == ']') || (cl == '{' && c == '}')) ofo = 1;//匹配 else { ofo = 0;//不匹配 break; } } } if(c == '@') break; } if(ofo == 1 && stackLen(s) == 0)//由于只读入括号,栈为空才匹配 printf("YES\n"); else printf("NO\n"); return 0; }