数据结构之单链表——括号匹配

本文是以单链表为数据结构进行括号匹配。
我先大致的说一下我的思路:

首先及建立一个单链表的基础结构,

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;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值