1、首先为了实现括号匹配,我运用了逻辑结构为栈,储存结构为链式存储两种组合来进行操作实现。一般常见的括号有以下几种:“(”、“)”、“[”、“]”、“{”、“}”、“<”、“>”四大类。什么情况为匹配什么情况不匹配呢?
比如:{[123]}是匹配的 、([1])[4]是匹配的 、((r]是不匹配的 、([y)]是不匹配的等等。
程序中如果是匹配的,则输出匹配成功,如果不匹配则输出匹配失败
栈的工作原理:栈作为一种数据结构 ,是一种只能在一端进行插入和删除操作的特殊 线性表 。它按照后进先出(先进后出)的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
2、程序如下:
//用到的头文件
#include <stdio.h>
#include <stdlib.h>
//定义一个结构体,用来存储一个数据元素的内容和指向下一个数据元素的地址
struct match
{
char bracket;
struct match *next;
};
//定义一个申请空间的函数,申请空间为一个结构体大小,用来表示头节点,并通过函数返回申请空间的首地址
struct match *creat_list()
{
struct match *head = malloc(sizeof(struct match));
if (head == NULL)
{
printf("creat fail\n");//如果申请失败则打印
}
head->next = NULL;//将头节点指向下一个元素的指针赋值为NULL
return head;
}
//实现在链表中插入元素
void insert_list(struct match *head,char bracket)
{
struct match *p = head;
struct match *new = malloc(sizeof(struct match));
if (new == NULL)
{
return ;
}
new->next = p->next;//将新创建的元素中的存储地址的内容指向上一个元素
p->next = new;//将新元素的地址给头指针
new->bracket = bracket;
}
//判断链表的元素是否为空,如果为空就不能删掉链表的元素
int empty(struct match *head)
{
if (head->next == NULL)
{
printf("is empty\n");
return 1;
}
return 0;
}
//删除链表里元素的函数,删掉的是后进栈的元素
void del_list(struct match *head)
{
struct match *p = head;
if (empty(p))
{
return ;
}
struct match *del = p->next;
p->next = del->next;
free(del);//删除过后要释放掉刚刚申请的内存空间
}
//此函数就是实现判断输入的括号是否匹配。原理就是先将输入的左括号一个一个的压栈(入栈),然后遇到了右括号就去跟栈顶上的元素匹配,如果匹配成功,则接着匹配,直到把栈里面的元素匹配完,当匹配一个括号的时候,栈就要出栈一个元素
int bra_match(struct match *head,char *buff) //{[<>]}
{
struct match *p = head;
for (int i = 0; *(buff+i) != '\0'; i++)
{
switch(*(buff+i))
{
case '{':
insert_list(p,'{');
break;
case '[':
insert_list(p,'[');
break;
case '<':
insert_list(p,'<');
break;
case '(':
insert_list(p,'(');
break;
case '}':
if('}'-2 == p->next->bracket)
{
del_list(p);
if (p->next == NULL)
{
return 1;
}
}
break;
case ']':
if(']'-2 == p->next->bracket)
{
del_list(p);
if (p->next == NULL)
{
return 1;
}
}
break;
case '>':
if('>'-2 == p->next->bracket)
{
del_list(p);
if (p->next == NULL)
{
return 1;
}
}
break;
case ')':
if(')'-1 == p->next->bracket)
{
del_list(p);
if (p->next == NULL)
{
return 1;
}
}
break;
default :
break;
}
}
}
//主函数,主要是实现调用功能函数,并打印相应的结果
int main(int argc, char const *argv[])
{
char buff[20];
int x;
scanf("%s",buff);
struct match *p = creat_list();
x = bra_match(p,buff);
if (x == 1)
{
printf("匹配成功\n");
}
else
{
printf("匹配失败\n");
}
return 0;
}
3、运行代码结果如下
4、总结
这是学数据结构的时候做的一道题,可能用到的C语言不是很难,但是要想做出来,必须要先理解栈的工作原理。学习的路途还很遥远,要坚持的学下去。陌生人,一起努力吧!