括号匹配(c语言)_栈的应用

问题描述
假设表达式中存在括号(各种括号),其嵌套的顺序随意,即([])[([][])]等为正确的格式,[(])(())均为不正确的格式。
思路
依次扫描所有字符,遇到左括号入栈,遇到右括号弹出栈顶元素是否匹配。
匹配失败的情况:

  • 左括号单身。例:()(
  • 右括号单身。例:())
  • 左右括号不匹配。例:(]

程序流程图(摘自b站王道考研)
在这里插入图片描述

代码

#include<stdio.h>
#define MaxSize 50   //定义栈中元素的最大个数
typedef struct{
	char data[MaxSize];   //静态数组存放栈中元素
	int top;              //栈顶指针 
}SqStack; 

//初始化栈
void InitStack(SqStack &S){
	S.top = -1;
} 

//判断栈是否为空
int StackEmpty(SqStack S){
	if(S.top == -1) 
		return 1;
	else 
		return 0;
} 

//新元素入栈
int Push(SqStack &S, char x){
	if(S.top == MaxSize-1) 
		return 0; //栈满,报错 
	S.data[++S.top] = x;
	return 1;
} 

//栈顶元素出栈,用x返回
int Pop(SqStack &S, char &x){
	if(S.top == -1) 
		return 0;  //栈空,报错 
	x = S.data[S.top--];
	return 1;
} 

//括号匹配
int bracketCheck(char str[], int length){
	SqStack S;
	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 0;       //匹配失败 
			}
			char topElem;
			Pop(S, topElem);     //栈顶元素出栈 
			if(str[i]==')' && topElem!='(') return 0;
			if(str[i]==']' && topElem!='[') return 0;
			if(str[i]=='}' && topElem!='{') return 0;
		}
	}
	return StackEmpty(S);   //检索完全部括号后,栈空说明匹配成功 
}

int main(){
	//括号个数 
	int length;
	scanf("%d",&length);
	getchar();
	//读取括号 
	char str[length];
	for(int i=0; i<length; i++)
		scanf("%c",&str[i]);
	//测试是否匹配 
	if(bracketCheck(str,length) == 1)
		printf("匹配成功");
	else
		printf("匹配失败");
	return 0;
} 

测试
测试1
在这里插入图片描述
测试2
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值