首页 > 技术文章 > 利用栈的特性判断括号是否匹配

miao123-blog 2020-11-08 17:16 原文

括号匹配的检验:假设输入字符串中有三种括号,大括号、中括号、小括号,其嵌套的方式是随意的。

类似的都为正确格式。

 

检验括号是否匹配的方法可用“期待的急迫程度”来解决。例如下面的括号串:

 

 当计算机接受第一个括号时,它期待着第六个括号与它见面,然而我们输入的却是第二个括号,同理,一直到第三个括号,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;
}

 

推荐阅读