当前位置: 首页 > news >正文

用栈进行左右括号的匹配

目录

前言

流程图

整体代码

关于不使用基本操作的代码

关于测试


前言

本篇文章主要整理了关于用栈实现左右括号匹配的代码。

栈是一种遵循后进先出(LIFO, Last In First Out)原则的抽象数据类型,非常适合用于处理括号匹配问题。

对于括号的匹配规则:在括号匹配中,最内层的括号对最先闭合。这意味着最近打开的左括号需要最先匹配到对应的右括号。这正好符合栈的后进先出(LIFO)特性。

流程图

整体代码

//2025.3.19 写下 用数组栈实现左右括号的配对 
#include<stdio.h>

#define MaxSize 20 //栈中最多存放20个数据元素 
typedef struct {
	char data[MaxSize]; //数据域 
	int top; //栈顶指针 
}SqStack; //顺序栈的存储结构 

//初始化栈
void InitStack(SqStack &S){
	S.top = -1;  //初始化栈顶指针 
}
//判断栈空
bool StackEmpty(SqStack S){
	if(S.top == -1) return true; //栈空
	else return false; //栈不空 
}
//元素入栈
bool Push(SqStack &S,char e){ //将元素e压入栈中 
	//首先判断栈是否满了
	if(S.top == MaxSize-1){
		printf("栈已满,出错!\n");
		return false; //不能入栈
	}
	//栈未满,将元素压入栈中
	S.data[++S.top] = e; //指针先自增一,然后再让元素入栈
	return true; 
}
//元素出栈 
bool Pop(SqStack &S,char &e){
	//首先判断栈是否为空
	if(StackEmpty(S) == true){
		printf("栈为空,出错!\n");
		return false; //不能出栈
	} 
	//将栈顶指针指的元素出栈
	e = S.data[S.top--];//先将元素出栈,然后指针减一
	return true; 
}

//对左右括号进行配对
bool bracketCheck(char str[],int length){ 
	SqStack S;  //先声明一个栈S,系统已自动为其分配了内存空间 
	InitStack(S); //初始化栈 
	char e = {0};
	int i=0; //i用来依次读取str中的数据
	for(i=0;i < length;i++)
	{
		//若该数据为左括号,则入栈 
		if(str[i] == '(' || str[i] == '{' || str[i] == '['){
			if(Push(S,str[i]) == false) //若元素入栈出错,则中止该程序
				break;
			else continue;
		}
		//若该数据为右括号,先判断栈是否为空,若不为空则弹出栈顶元素,并与该数据配对 
		else{
			if(StackEmpty(S)) return false; //扫描到右括号且当前栈为空,则匹配失败 
			Pop(S,e); //弹出栈顶元素 
			if(str[i] == ')' && e != '(') return false;
			if(str[i] == '}' && e != '{') return false;
			if(str[i] == ']' && e != '[') return false;
		}
	} 
	//若配对结束,栈中还有元素,则匹配出错
	return StackEmpty(S);
}
int main(){
	char str[50] = {0};
	int i=0;
	printf("请输入括号字符串:\n");
	while(scanf("%c",&str[i]) && str[i] != '\n'){
		i++;
	}
	//puts(str); //输出字符数组 
	if(bracketCheck(str,i) == false){ //其中i表示字符串的长度 
		printf("括号序列不匹配!\n");
	}else{
		printf("括号序列匹配!\n");
	}
	return 0;
}

关于不使用基本操作的代码

//2025.3.20 写下
#include<stdio.h>

#define MaxSize 20 //栈中最多存放10个数据元素 
typedef struct {
	char data[MaxSize]; //数据域 
	int top; //栈顶指针 
}SqStack; //顺序栈的存储结构 
//对左右括号进行配对
bool bracketCheck(char str[],int length){ 
	SqStack S;  //先声明一个栈S,系统已自动为其分配了内存空间 
	S.top = -1; //初始化栈 
	char e = {0};
	int i=0; //i用来依次读取str中的数据
	for(i=0;i < length;i++)
	{
		//若该数据为左括号,则入栈 
		if(str[i] == '(' || str[i] == '{' || str[i] == '['){
			//首先判断栈是否满 
			if(S.top == MaxSize-1) return false;
			S.data[++S.top] = str[i]; //指针先自增一,然后再让元素入栈
			continue;
		}
		//若该数据为右括号,先判断栈是否为空,若不为空则弹出栈顶元素,并与该数据配对 
		else{
			//先判断栈是否为空
			if(S.top == -1) return false; 
			//弹出栈顶元素
			e = S.data[S.top--]; //先将元素出栈,然后指针减一
			if(str[i] == ')' && e != '(') return false;
			if(str[i] == '}' && e != '{') return false;
			if(str[i] == ']' && e != '[') return false;
		}
	} 
	//若配对结束,栈中还有元素,则匹配出错
	if(S.top == MaxSize-1) return false;
	else return true;
}
int main(){
	char str[50] = {0};
	int i=0;
	printf("请输入括号字符串:\n");
	while(scanf("%c",&str[i]) && str[i] != '\n'){
		i++;
	}
	if(bracketCheck(str,i) == false){ //其中i表示字符串的长度 
		printf("括号序列不匹配!\n");
	}else{
		printf("括号序列匹配!\n");
	}
	return 0;
}

关于测试

当输入括号序列时,只支持在英文状态下的括号,若是输入的是中文状态下的括号,则会检测出错。我认为,是因为在遍历字符数组str时,每次只读取其中的一个char型数据为一个字节,而中文状态下的符号存储时(在我的编译器上)需要三个字节,因此在读取字符数组str时会出错。

并且,在输入str数组中的数据只能是括号哦,因为没有对其他字符做排除,若数组中有其它字符,会导致结果出错。

如果有错误,欢迎大家在评论区指出,谢谢~~

相关文章:

  • 【access开发】导入excel 并生成表
  • 无需qt-creator,使用Trae从0到1生成qt的开发、构建、调试环境
  • EasyRTC嵌入式音视频通信SDK:WebRTC技术下的硬件与软件协同演进,开启通信新时代
  • 基于Java(springMVC+hibernate)+Mysql实现(Web)客栈服务系统
  • 蓝桥杯--冲刺题单--随时更新
  • SpringCloud-创建项目
  • 【IDEA】 配置安装 Leetcode 插件
  • LeetCode 热题 100_跳跃游戏 II(79_45_中等_C++)(贪心算法)
  • RPA+AI 技术到底好在哪里?
  • 深度学习框架对比评测:TensorFlow、PyTorch、PaddlePaddle与MXNet的技术演进与应用实践
  • CUDA与cuDNN 的介绍
  • 从零开始实现Stable Diffusion本地部署
  • HTML图像标签的详细介绍
  • 火绒终端安全管理系统V2.0——行为管理(软件禁用+违规外联)
  • 如何为AI开发选择合适的服务器?
  • 用curl和python通过网络测试Ollama服务器的配置和状态
  • Kafka分区分配策略详解
  • Java基础面试知识路线
  • Hibernate Validation 注解全面教程
  • 批量删除 PPT 文档中的宏
  • 新疆生产建设兵团社会保障网站/网络营销策划是什么
  • 网站改版方案案例/站内优化seo
  • 网站建设方案书安全性/seo课程
  • 传统文化网站建设/谷歌手机网页版入口
  • 官方网站营销/媒体平台
  • 编程软件推荐/seo百度发包工具