栈在括号匹配中的应用

该博客介绍了如何实现一个括号匹配算法,用于检查表达式中括号的正确性。算法通过使用栈数据结构,逐个读取括号并进行匹配。当遇到左括号时,将其压入栈中;遇到右括号时,与栈顶的左括号匹配,不匹配则返回错误。最后,栈为空表示括号匹配成功,否则匹配失败。提供的C语言代码实现了这一逻辑。
摘要由CSDN通过智能技术生成

表达式中允许的括号包括( ,[ ,{ ,英文输入法下。其嵌套的顺序任意,([])或{([])}等为正确匹配的格式,{()]或(((}}})))为不能匹配的格式。

算法的思想如下:

1. 初始定义一个空栈,顺序读入括号

2. 若是左括号,左括号进栈,若是右括号,将栈顶元素与其匹配,不匹配直接返回false(此时如果栈是空的也返回false),匹配则继续读入括号,直至读完。

3. 算法结束是,如果栈空,则括号能正确匹配,否则不能。

具体代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 10
typedef char Ele; 
typedef struct Stack{
	Ele data[max];
	int top;
}Stack; 
void InitStack(Stack &S){
	S.top=-1;
}
bool StackEmpty(Stack S){
	if(S.top==-1) return true;
	else return false;
}
bool Push(Stack &S,Ele e){
	if(S.top==max-1) return false;
	S.data[++S.top]=e;
	return true;
}
bool Pop(Stack &S,Ele &e){
	if(StackEmpty(S)) return false;
	e=S.data[S.top--]; return true;
}
bool Match(char a[],int length){
	Stack S;//定义一个栈 
	InitStack(S);//栈的初始化 
	for(int i=0;i<length;i++){
		if(a[i]=='('||a[i]=='['||a[i]=='{'){//左括号入栈 
			Push(S,a[i]);
		}
			else{
				if(StackEmpty(S))
				return false;// 右括号且栈空,左右括号不匹配,返回false
				char topEle;//用来存放栈顶元素
				Pop(S,topEle);
				if(a[i]==')' && topEle!='(') return false;//如果括号不匹配,返回false 
				if(a[i]==']' && topEle!='[') return false;
				if(a[i]=='}' && topEle!='{') return false; 
			}
		
	}
	return StackEmpty(S);
}
int main(){
	int n;
	scanf("%d\n",&n);//!!!!此处一定要加\n,不然会在输入的时候把\n 读进字符数组!!!!!!! 
	char a[n];
	for(int i=0;i<n;i++){
		scanf("%c",&a[i]);
	}
	if(Match(a,n)) printf("括号匹配!\n");
	else printf("括号不匹配!\n");
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杪秋

一个计算机小白,期待您的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值