文章目录

  • 1. 项目结构
  • 2. LinkStack.h
  • 3. LinkStack.cpp
  • 4. main.cpp
  • 5. 测试结果

声明:括号匹配的实现使用的是.cpp文件。

  • 由于我使用的是vs2010,vs2010的编译器不支持函数返回值bool类型,并且不能这样定义for(int i= 0; i < 10; i++),必须在函数的开头声明i=0。为了编写的方便,我使用的是.cpp文件,没有使用.c文件。虽然是c++文件,但是内容是c语言。如果有需要.c文件的,请自行修改这两个地方就可以了。

注意:项目中使用的栈是动态链式栈(带头结点)。

1. 项目结构

2. LinkStack.h

/*
* 使用动态链表实现链式栈(不带头结点)
*/// 1. 定义抽象数据类型
typedef struct {char elem;
} ElemType;// 2. 定义链式栈的结点
typedef struct LNode{ElemType data;struct LNode * next;
} LNode;// 3. 定义一些接口/**
* func:初始化链式栈
* @head:头指针
*/
void initStack(LNode ** head);/**
* func:销毁链式栈
* @head:头指针
*/
bool isStackEmpty(LNode * head);/**
* func:判断栈是否为空
* @head:头指针
*/
void destroyStack(LNode ** head);/**
* func:向栈顶压入元素
* @head:头指针
* @x:要添加的元素
*/
bool push(LNode * head, ElemType x);/**
* func:弹出栈顶元素
* @head:头指针
* @x:存放要删除的元素
*/
bool pop(LNode * head, ElemType * x);/**
* func:查看栈顶元素
* @head:头指针
* @x:存放要查看的元素
*/
bool selectStackTopElem(LNode * head, ElemType * x);

3. LinkStack.cpp

#include <stdio.h>
#include <stdlib.h>
#include "LinkStack.h"/**
* func:初始化链式栈
*/
void initStack(LNode ** head) {*head = (LNode *)malloc(sizeof(LNode));(*head)->next = NULL;
}/**
* func判断栈是否为空
* @head:头指针
*/
bool isStackEmpty(LNode * head) {if (head->next == NULL)return true;elsereturn false;
}/**
* func:销毁链式栈
* @head:头指针
*/
void destroyStack(LNode ** head) {LNode * t;while(*head != NULL) {t = *head;*head = (*head)->next;free(t);}*head = t = NULL;
}/**
* func:向栈顶压入元素
* @head:头指针
* @x:要添加的元素
*/
bool push(LNode * head, ElemType x) {// 先动态分配一个结点if (head == NULL)return false;LNode * temp = (LNode *)malloc(sizeof(LNode));if (temp == NULL)return NULL;// 再将该结点压入栈中temp->data = x;temp->next = head->next;head->next = temp;return true;
}/**
* func:弹出栈顶元素
* @head:头指针
* @x:存放要删除的元素
*/
bool pop(LNode * head, ElemType * x) {// 判断栈是否为空if (isStackEmpty(head)) return false;// 栈不为空,则删除栈顶元素LNode * p = head->next;*x = p->data;head->next = p->next;free(p);p = NULL;return true;
}/**
* func:查看栈顶元素
* @head:头指针
* @x:存放要查看的元素
*/
bool selectStackTopElem(LNode * head, ElemType * x) {// 判断栈是否为空if (isStackEmpty(head)) return false;// 栈不为空,则查看栈顶元素*x = head->next->data;return true;
}

4. main.cpp

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "LinkStack.h"/**
* func:将字符封装为抽象数据类型,方便使用之前写过的链式栈
* @x:要封装的字符
* return:封装的抽象数据类型
*/
ElemType getElem(char x) {ElemType temp;temp.elem = x;return temp;
}/**
* func:对一个字符串进行括号匹配,如果是对的就返回true,错的就返回false
* @str:要检测的字符串
* @length:字符串str的长度
* return:括号匹配是对的,则返回true,错的就返回false
*/
bool bracketCheck(char * str, int length) {// 初始化一个栈LNode * stack;initStack(&stack);// 遍历字符串for (int i = 0; i < length; i++) {// 判断当前元素是否为左括号if (str[i] == '(' || str[i] == '{' || str[i] == '[') //如果是左括号,则压入栈中push(stack, getElem(str[i]));else {    // 右括号则与栈弹出的元素比较// 判断栈是否为空if (isStackEmpty(stack))return false; // 若栈为空,说明不匹配// 弹出栈顶元素,判断是否与该元素相等ElemType temp;pop(stack, &temp);if (str[i] == ')' && temp.elem != '(')return false;if (str[i] == '}' && temp.elem != '{')return false;if (str[i] == ']' && temp.elem != '[')return false;}}return isStackEmpty(stack);
}void main() {char a[50];printf("请输入一个括号字符串:");scanf("%s", a);// 判断该括号字符串是否合法if (bracketCheck(a, strlen(a)))printf("判断结果:合法\n");elseprintf("判断结果:不合法\n");
}

5. 测试结果


数据结构中括号匹配的代码实现(C语言)相关推荐

  1. 数据结构-冒泡排序最优代码(C语言)

    冒泡排序的基本思想 冒泡排序也称气泡排序,是一种典型的交换排序方法,其基本思想是通过无序区中相邻元素关键字间的比较和位置的交换使关键字最小的元素如气泡一般逐渐往上"漂浮",直至&q ...

  2. 严蔚敏《数据结构》的全部代码实现(C语言)

    严蔚敏<数据结构>的全部代码实现(C语言)源码全部都在! http://u.115.com/file/f710d0eca1     提取码 f710d0eca1

  3. php 上万关键字匹配,JavaScript 上万关键字瞬间匹配实现代码

    JavaScript 上万关键字瞬间匹配实现代码 更新时间:2013年07月07日 23:36:21   作者: 发一篇之前写的文章,平时还是经常用到的,尤其是河蟹词特别多的聊天系统里 提到关键字搜索 ...

  4. 数组数据结构的使用与代码编写(一)

    数组数据结构的使用与代码编写(一) 数组的使用 js中的数组 一.属性 1.length设置或返回数组元素的数目. 2.constructor返回构造函数的引用 var a=["a" ...

  5. 知识库递归编程java和prolog代码;逻辑语言Prolog简介(附24555字PDF发“递归prolog简介”下载)

    知识库递归编程java和prolog代码:逻辑语言Prolog简介(附24555字PDF发"递归prolog简介"下载) 数据简化DataSimp 今天 数据简化DataSimp导 ...

  6. 如何将matlab代码转为C语言(2)--在C++中调用matlab的函数

    如何将matlab代码转为C语言(2)–在C++中调用matlab的函数 在上一条博文中提供了一种直接在matlab操作中的方法,下面提供一种新的调用方法,即在C++中调用matlab中的dll文件. ...

  7. 数据结构_dfs深度优先算法入门(C语言)

    数据结构_dfs深度优先算法入门(C语言) 文章目录 数据结构_dfs深度优先算法入门(C语言) 0.闲话 1.个人理解 2.全排列问题(1到n的排列组合) 2.八皇后问题求解 3.二维迷宫 (1)只 ...

  8. php switch 判断多个,php switch语句多个值匹配同一代码块的实现

    php switch语句多个值匹配同一代码块的实现 先说说switch()语句的格式 switch(表达式){ case 匹配1: 当匹配1和表达式匹配成功执行的代码; break; case 匹配2 ...

  9. python叫什么语言-Python代码是什么语言

    Python代码是一种计算机程序设计语言,是一种动态的.面向对象的脚本语言,最初是用来编写自动化脚本的,随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发. Python代码是 ...

最新文章

  1. scipy csr_matrix csc_matrix
  2. 为什么在notebook里面还是显示torch_torch.utils.cpp_extension对c++/cuda进行拓展
  3. Git 重置reset,检出checkout和回滚revert(reverse)有什么区别?
  4. 06004_Redis的启动、使用和停止
  5. pycharm的console输入如何换行
  6. jpa的查询api_为JPA的本机查询API键入安全查询
  7. mac php5.6.30与php7共存,认识Homebrew以及在Mac上同时安装PHP5及PHP7
  8. java课程设计(图书管理系统)
  9. html实现动态折线图
  10. TiDB在360云平台的落地
  11. ios捕捉键盘view
  12. java命令javac java,使用命令行JAVAC编译Java
  13. 移动超级sim卡 无法下载卡_共迎未来无限可能!5G超级SIM卡亮相2019中国移动全球合作伙伴大会...
  14. 一个很好的反选的例子
  15. LINUX上开发ffmpeg程序,查看链接的库
  16. 前端预览excel插件_网页实现Excel在线预览方案集合
  17. 如何查html病毒svchost.exe,解决html文件的DropFileName = svchost.exe木马
  18. window.print react+antd 分页打印 去掉页眉页脚
  19. PIC18f46j50单片机里SPI部分的一点程序
  20. php开发中常用字符串函数总结

热门文章

  1. VCAP –设计:VMWARE VSPHERE DISTRIBUTED SWITCH最佳实践说明
  2. 大分子葡聚糖-牛血清蛋白抗原偶联物(Dextran-BSA)|多糖-蛋白偶联物
  3. 计算机的启动方式(冷启动、热启动、复位启动)、注销、待机
  4. 不用第三方工具解压缩msi文件提取文件
  5. 中国科学院大学计算机科学与技术学院复试,中国科学院大学计算机科学与技术考研经验分享...
  6. 智能证件照怎么ps?自己就能在家制作
  7. WPS本地镜像化在线文档操作以及样例
  8. SAP 批次确定界面可用数量为什么显示9,999,999,999
  9. 矩阵键盘与六位数码管_[走近FPGA]之矩阵键盘
  10. 饥荒联机 linux手把手开服教程