文章目录
原理
我们有这样一组括号序列
根据下面的序号我们可以知道第一个括号与最后一个括号进行匹配,第二个与倒数第二个进行匹配其他的以此类推,我们发现括号匹配具有先进后匹配
的特性,这一特性刚好和栈的特性相匹配(先进后出)
,我们利用栈的原理进行存储
当我们遇到(,[,{
这一类的括号使我们让这一类括号进栈,当我们遇到),],}
这一类括号使我不让他们入栈反而让栈顶元素出栈,与之相匹配如图
若出栈的括号能与此括号匹配则继续检查后续括号序列
如果对你有所帮助,点个赞呗
括号不匹配情型
中间不匹配型
如图
这两个括号在现实世界中也是不合法的括号类型,遇到这种情况,我们检查到此处无需在比较后续括号序列
后缀多余型
如图
这类型的特点是其他的匹配完了,但是括号序列中还有括号无法匹配
前缀多余型
如图
这类型的特点是括号序列中无括号在匹配,但栈中还有元素
以上这三种情况我们都需考虑到
实现代码
结构体
#define MaxSize 50
#define True '1'
#define False '0'
typedef struct Queue
{
char data[MaxSize];
int top;//指针
}Queue;
实现代码
具体的函数代码请移步至–>C语言 一分钟看懂的顺序存储栈表操作
Main函数
#include"括号匹配.h"
#include<stdio.h>
#include<malloc.h>
int main()
{
Queue Q;
char X='\0';
int Number=0;
printf("请输入括号个数\n");
scanf_s("%d", &Number);
getchar();
char* Value = (char*)malloc(sizeof(char) * Number);
printf("请输入括号序列\n");
gets(Value);
InitQueue(&Q);
int i = 0;
while (i<Number)
{
if (Value[i] == '(' || Value[i] == '{' || Value[i] == '[')
{
EndQueue(&Q, Value[i]);//入栈
}
else
{
int i=DeleteQueue(&Q, &X);//出栈
if (i == False)//如果队列为空数组里还有括号则括号不匹配
{
printf("括号不匹配\n");
return;
}
switch (Value[i])
{
case ')':
{
if (X != '(')
{
printf("括号不匹配\n");
return;
}
}
break;
case '}':
{
if (X != '{')
{
printf("括号不匹配\n");
return;
}
}
break;
case ']':
{
if (X != '[')
{
printf("括号不匹配\n");
return;
}
}
break;
default:
break;
}
}
i++;
}
if (Q.top != -1)//当括号匹配完之后,栈里面还剩括号,则括号不匹配
{
printf("括号序列不匹配\n");
return;
}
if (i < Number)//如果i小于括号序列数,则括号序列还有括号未匹配,说明括号不匹配
{
printf("括号序列匹配\n");
}
else {
printf("括号序列不匹配\n");
}
}