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

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

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

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值