————搬砖:https://blog.csdn.net/qq_36805270/article/details/89979173
括号匹配问题是栈应用的一个经典场景,原理比较简单:
括号匹配原理
假设表达式中允许包含两种括号:圆括号和方括号,其嵌入的顺序随意,即([ ] ( ))或[([ ] [ ])]等为正确的格式,[(])或([())或(())]均为不正确的格式。检验括号是否匹配的方法可用“期待的急迫程度”这个概念来描述。
在这里插入图片描述
由此,在算法中设置一个栈,每读入一个括号,若是右括号,则或者使置于栈顶的最击破的期待得以消解,或者是不合法的情况;若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原有的在栈中的所有未消解的期待的急迫性都降了一级。另外,在算法的开始和结束时,栈都应该是空的。
不过多搬了 这个直接上代码
#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("
左括号多余");
}
}