利用顺序栈实现:判别表达式中括弧是否正确配对(BracketMatch函数)

本文主要是介绍利用顺序栈实现:判别表达式中括弧是否正确配对(BracketMatch函数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include<stdio.h>
#include<stdlib.h>
#define INITSTACKSIZE 20
#define INCREASESIZE 10typedef char SElemType;
typedef struct {SElemType *base;SElemType *top;int stacksize;
} SqStack;void initStack(SqStack* S);//将S初始化空栈
void push(SqStack* S,SElemType e);//将e压入栈S
SElemType pop(SqStack* S);//弹栈S,返回弹出的元素
void showStack(SqStack* S);//查看栈所有数据
int isEmpty(SqStack* S);//判断栈是否为空
void createStack(SqStack* S,SElemType *arr,int n);//将长度为n的数组arr压入栈中char getLeft(char right);//获取传入括号右边的字符,返回左边的字符/*假设一个算数表达式中包含圆括弧、方括弧和花括弧三种类型的括弧,编写一个判别表达式中
括弧是否正确配对的BracketMatch函数。*/
int BracketMatch(SElemType *str);int main()
{SElemType *str = "{5+[4*(3+6)]-5}*6";printf("算术表达式:%s\n",str);if(BracketMatch(str)){printf("括弧正确匹配!");}else{printf("括弧不匹配!");}getchar();return 0;
}int BracketMatch(SElemType *str)
{SqStack S;SElemType *p = str;initStack(&S);while(*p != '\0'){if(*p == '(' || *p == '[' || *p == '{'){push(&S, *p);}if(*p == ')' || *p == ']' || *p == '}'){if(getLeft(*p) != pop(&S)){return 0;}}p++;}//若此时栈S为空,说明括号匹配return isEmpty(&S)?1:0;
}char getLeft(char right)
{switch(right){case ')':return '(';break;case ']':return '[';break;case '}':return '{';break;default:printf("getLeft() 函数参数不正确!");return 0;}
}void initStack(SqStack* S)
{S->base = (SElemType *)malloc(INITSTACKSIZE * sizeof(SElemType));if(NULL == S->base){printf("初始化栈失败!\n");exit(1);}S->top = S->base;S->stacksize = 0;
}int isEmpty(SqStack* S)
{if(S->stacksize == 0){return 1;}else{return 0;}
}void push(SqStack* S,SElemType e)
{if(S->stacksize <= S->top - S->base){S->base = (SElemType *)realloc(S->base,(S->stacksize + INCREASESIZE) * sizeof(SElemType));}*(S->top) = e;S->top++;S->stacksize++;
}SElemType pop(SqStack* S)
{if(S->base == S->top){printf("当前栈为空,不能进行弹栈操作!\n");return 0;}S->top--;S->stacksize--;return *(S->top);
}void showStack(SqStack* S)
{int i,length = S->top - S->base;for(i = 0;i < length;i++){printf("%c ",S->base[i]);}printf("\n");
}void createStack(SqStack* S,SElemType *arr,int n)
{int i;for(i = 0;i < n;i++){push(S,arr[i]);}
}

这篇关于利用顺序栈实现:判别表达式中括弧是否正确配对(BracketMatch函数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/951331

相关文章

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构