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

来源:互联网 发布:点卡充值软件 编辑:程序博客网 时间:2024/05/29 06:34

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

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

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谢谢采纳)