【数据结构】括号的匹配问题

————搬砖:https://blog.csdn.net/qq_36805270/article/details/89979173
括号匹配问题是栈应用的一个经典场景,原理比较简单:

括号匹配原理

假设表达式中允许包含两种括号:圆括号和方括号,其嵌入的顺序随意,即([ ] ( ))或[([ ] [ ])]等为正确的格式,[(])或([())或(())]均为不正确的格式。检验括号是否匹配的方法可用“期待的急迫程度”这个概念来描述。
在这里插入图片描述
image
由此,在算法中设置一个栈,每读入一个括号,若是右括号,则或者使置于栈顶的最击破的期待得以消解,或者是不合法的情况;若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原有的在栈中的所有未消解的期待的急迫性都降了一级。另外,在算法的开始和结束时,栈都应该是空的。

不过多搬了 这个直接上代码

#include <stdio.h>
#include <stdlib.h>
#include "Stact.h"  //自定义头文件 内存储栈的基本操作  char 
/*---括号匹配问题---*/
int main(){
    char ch[STACK_INIT_SIZE ];
    scanf("%s",ch);
    BracketMatch(ch);


}
 int Match(char a,char b)
{
    if((a=='[' && b==']')||(a=='(' && b==')')||(a=='{' && b=='}'))
        return 1;
    else
        return 0;
}
void BracketMatch(char *str)
{
    char ch;
    SeqStack *s;
    int i;
    s = (SeqStack*)malloc(sizeof(SeqStack));
    InitStack(s);

    for(i = 0;str[i]!='';i++)
    {
        switch(str[i])
        {
            case '(': push(s,str[i]);break;
            case '[': push(s,str[i]);break;
            case '{': push(s,str[i]);break;
            case ')':{
                        if(IsEmpty(s))
                        {
                            printf("
左括号多余");return;
                        }
                        else
                        {
                            getTop(s,&ch);
                            if(Match(ch,str[i]))
                            {
                                Pop(s,&ch);

                            }
                            else
                            {
                                printf("
对应左右括号不同类");
                            }
                        }
                      };break;
            case ']': {
                        if(IsEmpty(s))
                        {
                            printf("
左括号多余");return;
                        }
                        else
                        {
                            getTop(s,&ch);
                            if(Match(ch,str[i]))
                            {
                                Pop(s,&ch);

                            }
                            else
                            {
                                printf("
对应左右括号不同类");
                            }
                        }
                      };break;
            case '}':{
                        if(IsEmpty(s))
                        {
                            printf("
左括号多余");return;
                        }
                        else
                        {
                            getTop(s,&ch);
                            if(Match(ch,str[i]))
                            {
                                Pop(s,&ch);

                            }
                            else
                            {
                                printf("
对应左右括号不同类");
                            }
                        }
                      };break;
        }


    }
    if(IsEmpty(s))
    {
        printf("
括号匹配");

    }else
    {
        printf("
左括号多余");
    }

}



原文地址:https://www.cnblogs.com/zhujiaozhu/p/15413677.html