栈的应用———括号匹配

栈在括号匹配中的应用

在这里插入图片描述

问题,如何实现对括号的匹配呢?就像在写代码的过程中,如果理应成对出现的括号缺少了左括号,我们的IDE如何进行判断的呢?

思路:
  • 最后出现的左括号最先被被匹配----类似于栈的(LIFO)后进先出特性;
  • 每出现一个右括号,就“消耗”一个左括号——类型栈的出栈操作。
  • 在这里插入图片描述
算法步骤
  • 初始时设置一个空栈,顺序读入括号;
  • 若是右括号——则1:使得治愈栈顶的最急迫期待得以消解,或者2:不合法情况,括号不匹配,推出程序)
  • 若是左括号——作为一个更新的更急迫的期待压入栈中,自然使原有的在栈中的所有未消解的期待急迫性降了一级——左括号置为栈顶。
  • 算法结束时,栈为空,否则括号序列不匹配。
代码实现

主函数的核心思路需要用到上述算法,但也会有用到栈的基本操作,这就需要参看之前的博客栈——栈的基本概念和基本操作


#define MaxSize 10    //定义栈中元素的最大个数
//定义栈的结构
typedef struct{ 
	char data [MaxSize];      //静态数组存放栈中元素
	int top;                 //栈顶指针
}SqStack S;

//初始化栈
void InitStack(SqStack &S){
	S.top=-1;//初始化栈顶指针,开始栈中无元素。
}
//函数功能:判断栈空
bool StackEmpty(SqStack S){
	if(S.top=-1);//栈空
		return ture;
	else        //不空
		return false;
}
//函数功能——新元素x入栈
bool Push(SqStack &S,ElemType x){
	if(S.top==MaxSize-1)//栈满,报错
		return false;
	S.data[++S.top]=x;  //栈指针先加一,新元素入栈。top值先加一,再使用top的指针放入新元素
	return ture;
}


//函数功能——栈顶元素出栈,并用x返回
bool Pop(SqStack &S,ElemType &x){
	if(S.top==-1)//栈空,报错
		return false;
	x=S.data[S.top--]  //栈顶元素先出栈.栈指针再减1;先使用top的值获得对应的栈顶元素,然后top的值再减一。
	return ture;
}





//函数功能:实现括号匹配
booL bracketCheck(char str[], int length) {
	InitStack(S); //初始化- 个栈
	for (int i=0; i<length; i++){
		if (str[i]=='('||str[i]=='['|| str[i]=='{'){
			Push(S,str[i]);              //扫描到的都是左括号,入栈操作
			}
		else{
			if(StackEmpty(S)){            //扫描到右括号,且当前栈空;
				return false;
				}
			char topElem;
			Pop(S,topElem);               // 栈顶元素出栈
			if(str[i]==')' && topElem!='(')
				return false;
			if(str[i]==']' && topElem!='[')
				return false;
			if(str[i]=='}' && topElem!='{')
				return false;
		}
	}
	return StackEmpty(S);                  //检索完全部括号后, 栈空说明匹配成功
}

备注:之前的博客写的有点啰嗦,内容过多了也不太好,所以就简洁一点!

还请多多点赞关注支持!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值