数据结构之单链表——括号匹配
来源:互联网 发布:点卡充值软件 编辑:程序博客网 时间: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谢谢采纳)
- 数据结构之单链表——括号匹配
- 数据结构之括号匹配
- 数据结构——括号匹配
- 数据结构之括号匹配问题
- 【数据结构——栈】括号匹配
- 数据结构实践——括号的匹配
- 数据结构练习2——括号匹配
- 数据结构——栈实现括号匹配
- 数据结构之栈之括号匹配问题
- 数据结构笔记之——括号匹配(栈的应用之一)(SDOJ 2134)
- 数据结构与算法学习之路:检查表达式的括号是否匹配——栈
- 数据结构栈的应用之括号匹配
- 数据结构之 栈的应用 括号匹配
- 数据结构实验之栈四:括号匹配
- 数据结构实验之栈四:括号匹配
- 数据结构实验之栈四:括号匹配
- 数据结构实验之栈四:括号匹配
- 数据结构实验之栈四:括号匹配
- BOM
- 冈萨雷斯数字图像处理学习2:视觉基础
- 当需要插入mysql的数据包含单双引号时处理方法
- 顺序表学生个人健康信息表(数组)
- OneinStack中LNMP环境给Nginx开启pathinfo
- 数据结构之单链表——括号匹配
- 热部署,未测试
- STM32 程序如何运行
- RN中,你还在担心怎么传Json文件给服务器?来看看Json内容吧
- 贝叶斯分类器
- Cookie/Session机制详解
- JavaScript HTML DOM常用语法
- ConfigReader(十四)—— ReadGuideHelpConfig
- MySQL系列之源码浅析