利用顺序栈实现:判别表达式中括弧是否正确配对(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

相关文章

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)