本文是以单链表为数据结构进行括号匹配。
我先大致的说一下我的思路:
首先及建立一个单链表的基础结构,
typedef int ElemType;//自定义数据类型
typedef enum { ERROR = 0, OK = 1 }Status;
typedef struct node {
ElemType data;
struct node* next;
}Node, *PtrNode;
typedef struct list {
PtrNode head;
int cursize;
}List;
链表的初始化
Status InitList(List *plist)
{
if (plist == NULL) return(ERROR);
plist->head = BuyNode();
plist->cursize = 0;
return(OK);
}
清除链表数据
//清除链表数据,使头结点->next=NULL;
Status ClearList(List *plist)
{
if (plist == NULL) return(ERROR);
while (plist->head->next != NULL)
{
PtrNode p = plist->head->next;
plist->head->next = p->next;
free(p);
}
return(OK);
}
从链表的头开始插入数据
//头插法添加数据;
Status Insert_head(List *plist, ElemType x)
{
if (plist == NULL) return(ERROR);
PtrNode s = BuyNode();
s->next = plist->head->next;
plist->head->next = s;
s->data = x;
plist->cursize += 1;
return(OK);
}
从链表的尾部插入数据
//尾插法添加数据;
Status Insert_tail(List *plist, ElemType x)
{
if (plist == NULL) return(ERROR);
PtrNode s = BuyNode();
PtrNode p = plist->head;
while (p->next != NULL)
{
p = p->next;
}
p->next = s;
s->data = x;
plist->cursize += 1;
return(OK);
}
输出链表中的数据(在这里我写了两个输出函数(这个主要是为了显示提示信息的))
void Visit(List *ls)
{
printf("ouput List:");
PtrNode p = ls->head->next;
while (p != NULL)
{
printf("- %c", p->data);
p = p->next;
}
printf("\noutput list end \n");
}
主体部分大致就是这些,具体的思路与做法:将读到的括号字符按顺序先存在(char *str) str变量中,通过strlen(str)获取str中存储的字符的个数(strlen是库函数在string.h头文件中)然后在以相同的顺序放入链表中,因为在这里我是采用的头插法存储数据所以是将str中的字符倒序存储(保证链表中括号的先后顺序与字符串str中一致),然后通过test函数进行匹配(test是我定义的函数)。
test实现方法:
以s=list->head(头结点)作为初始节点,让s的next->data数据节点与next->next->data进行匹配,匹配成功就将这两个节点删除,返回到初始节点,再进行匹配,如果这两个数据节点的括号不匹配就让 s = s->next;再循环执行让s的next->data数据节点与next->next->data进行匹配,直到s->next->next == NULL结束;如果s->next!= NULL,s->next->next==NULL;就说要么个数不匹配要么括号自身杂乱而不匹配,
void test(List * ls)
{
printf("testing......\n\
\r-----------------------------------------\n\
\r Test Results \n\
\r-----------------------------------------\n");
int tag = 1;
while(tag == 1)
{
PtrNode s = ls->head;
if (s->next == NULL) {
printf("\n**** 1.sockets match ****\n");
break;
}
if (s->next->next == NULL)
{
printf("\n**** number not sockets match ****\n");
break;
}
while (s->next->next != NULL)
{
//if (s->next->data == 0x7B)
if (s->next->data == '{')
{
PtrNode p = s->next;
//if (s->next->next->data == 0x7D)
if (s->next->next->data == '}')
{
PtrNode q = s->next->next;
s->next = s->next->next->next;
ls->cursize -= 2;
free(q);
q = NULL;
free(p);
p = NULL;
break;
}
else
{
s = s->next;
continue;
}
}
//else if (s->next->data == 0x28)
else if (s->next->data == '[')
{
PtrNode p = s->next;
//if (s->next->next->data == 0x29)
if (s->next->next->data == ']')
{
PtrNode q = s->next->next;
s->next = s->next->next->next;
ls->cursize -= 2;
free(q);
q = NULL;
free(p);
p = NULL;
break;
}
else
{
s = s->next;
continue;
}
}
//else if (s->next->data == 0x5B)
else if (s->next->data == '(')
{
PtrNode p = s->next;
//if (s->next->next->data == 0x5D)
if (s->next->next->data == ')')
{
PtrNode q = s->next->next;
s->next = s->next->next->next;
ls->cursize -= 2;
free(q);
q = NULL;
free(p);
p = NULL;
break;
}
else
{
s = s->next;
}
}
//else if(s->next != NULL){
//tag = 0;
//printf("\n---- list data error ----\n");
//break;
//}
else
{
tag = 0;
printf("socket match error\n");
break;
}
}
}
printf("\ntest end\n");
}
下面就是完整的代码(括号匹配——单链表,代码拷贝后可以直接运行)
(对代码有疑问或代码实现如果有错误可以私信或留言,谢谢采纳)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
typedef int ElemType;//自定义数据类型
typedef enum { ERROR = 0, OK = 1 }Status;
typedef struct node {
ElemType data;
struct node* next;
}Node, *PtrNode;
typedef struct list {
PtrNode head;
int cursize;
}List;
PtrNode BuyNode()
{
PtrNode s = (PtrNode)malloc(sizeof(Node));
if (s == NULL)exit(-1);
memset(s, 0, sizeof(Node));/* 首次给这片空间赋值,相当于初始化*/
s->next = NULL;
return s;
}
/*初始化一个单链表,具有头指针,头结点,头结点->next=NULL;*/
Status InitList(List *plist)
{
if (plist == NULL) return(ERROR);
plist->head = BuyNode();
plist->cursize = 0;
return(OK);
}
//清除链表数据,使头结点->next=NULL;
Status ClearList(List *plist)
{
if (plist == NULL) return(ERROR);
while (plist->head->next != NULL)
{
PtrNode p = plist->head->next;
plist->head->next = p->next;
free(p);
}
return(OK);
}
Status DestroyList(List *plist)
{
if (plist == NULL) return(ERROR);
ClearList(plist);
free(plist->head);
plist->head = NULL;
return(OK);
}
//头插法添加数据;
Status Insert_head(List *plist, ElemType x)
{
if (plist == NULL) return(ERROR);
PtrNode s = BuyNode();
s->next = plist->head->next;
plist->head->next = s;
s->data = x;
plist->cursize += 1;
return(OK);
}
//尾插法添加数据;
Status Insert_tail(List *plist, ElemType x)
{
if (plist == NULL) return(ERROR);
PtrNode s = BuyNode();
PtrNode p = plist->head;
while (p->next != NULL)
{
p = p->next;
}
p->next = s;
s->data = x;
plist->cursize += 1;
return(OK);
}
int getlength(List *plist)//获取单链表的长度;
{
if (plist == NULL)
{
system("color 09");
printf("getlength failed: 链表被摧毁或不存在\n");
exit(0);
}
return(plist->cursize);
}
Status printList(List *plist)//打印整个链表;
{
if (plist == NULL) return(ERROR);
PtrNode p = plist->head->next;
while (p != NULL)
{
printf("%d\n", p->data);
p = p->next;
}
return(OK);
}
//获取链表中第i个位置处节点的数据元素;
ElemType getElem(List *plist, int i)
{
if (plist == NULL) return(ERROR);
PtrNode p = plist->head->next; //指向第一个有数据的节点
int val = 1;
for (; val < i; val++)
{
p = p->next;// val=1 p指向第二个。当val=i-1 p指向第i个数据节点
}
return(p->data);
}
//删除第一个数据
Status Del_head(List *plist)
{
if (plist == NULL) return(ERROR);
PtrNode p = plist->head->next;
plist->head->next = plist->head->next->next;
free(p);
p = NULL;
return(OK);
}
void test(List * ls)
{
printf("testing......\n\
\r-----------------------------------------\n\
\r Test Results \n\
\r-----------------------------------------\n");
int tag = 1;
while(tag == 1)
{
PtrNode s = ls->head;
if (s->next == NULL) {
printf("\n**** 1.sockets match ****\n");
break;
}
else if (s->next->next == NULL)
{
printf("\n**** number not sockets match ****\n");
break;
}
while (s->next->next != NULL)
{
//if (s->next->data == 0x7B)
if (s->next->data == '{')
{
PtrNode p = s->next;
//if (s->next->next->data == 0x7D)
if (s->next->next->data == '}')
{
PtrNode q = s->next->next;
s->next = s->next->next->next;
ls->cursize -= 2;
free(q);
q = NULL;
free(p);
p = NULL;
break;
}
else
{
s = s->next;
continue;
}
}
//else if (s->next->data == 0x28)
else if (s->next->data == '[')
{
PtrNode p = s->next;
//if (s->next->next->data == 0x29)
if (s->next->next->data == ']')
{
PtrNode q = s->next->next;
s->next = s->next->next->next;
ls->cursize -= 2;
free(q);
q = NULL;
free(p);
p = NULL;
break;
}
else
{
s = s->next;
continue;
}
}
//else if (s->next->data == 0x5B)
else if (s->next->data == '(')
{
PtrNode p = s->next;
//if (s->next->next->data == 0x5D)
if (s->next->next->data == ')')
{
PtrNode q = s->next->next;
s->next = s->next->next->next;
ls->cursize -= 2;
free(q);
q = NULL;
free(p);
p = NULL;
break;
}
else
{
s = s->next;
}
}
//else if(s->next != NULL){
//tag = 0;
//printf("\n---- list data error ----\n");
//break;
//}
else
{
tag = 0;
printf("socket match error\n");
break;
}
}
}
printf("\ntest end\n");
}
/*将str中的字符依次存入链表中*/
void ckeck(char *str, int n, List *xl)
{
int i = n-1;
for (; i>=0; i--)
{
Insert_head(xl, str[i]);
}
}
void Visit(List *ls)
{
printf("ouput List:");
PtrNode p = ls->head->next;
while (p != NULL)
{
printf("- %c", p->data);
p = p->next;
}
printf("\noutput list end \n");
}
int main()
{
List myls;
InitList(&myls);
char *str = "{}([])";
int n = strlen(str);
printf("n=%d\n", n);
ckeck(str, n, &myls);
test(&myls);
Visit(&myls);
printf("\nPoint out:\n\
\r !Press any key to exit.....\n");
getchar();
//
return 0;
}
(对代码有疑问或代码实现如果有错误可以私信或留言,联系方式:QQ:1145603081 或邮箱1145603081@qq.com谢谢采纳)