栈的应用---用栈实现括号匹配(C语言实现)

栈的应用—用栈实现括号匹配(C语言实现)

前言

​ 括号匹配应该很常见了。

​ 例如: ①()[{}] ②{{]]}}

​ ①能匹配成功,②匹配失败。即每一个左括号都能找到与之匹配的右括号,反之亦然。

算法思想

​ 用一个数组存储括号,记为 str[],例如 str[] = “{[()]}”

​ 依次读取数组的元素,若是遇到左括号,则将其压入栈中;若是遇到右括号,则先判断栈是否空了,如果栈已经空了,匹配失败,如果栈不空,则弹出栈顶元素,看弹出的元素是否能与该右括号匹配,如果不能匹配,说明括号匹配失败。等遍历到数组的末尾时,看栈是否为空,如果空了,匹配成功,如果不空,匹配失败。

全部代码

​ 之前已经写过一篇实现顺序栈的文章C语言实现顺序栈,用链栈也差不多,为图方便,我直接用顺序栈实现了。本次是在之前这篇文章的基础上改了一点结构,然后编写括号匹配的函数实现。

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h> //根据C99标准,C语言使用bool类型需要添加这个头文件
#define MaxSize 10	//顺序栈这里使用静态分配的方式,所以手动规定最大容量 

typedef char ElemType;//
 
//-------结构体定义部分------ //
typedef struct{
	ElemType data[MaxSize];
	int top;//指向栈顶元素的指针  
}MyStack;
//-------结构体定义部分------ //
 
//-------函数声明部分------ //
void InitStack(MyStack *S);//栈的初始化 
bool Push(MyStack *S,ElemType e);//将元素e压入栈 
bool Pop(MyStack *S,ElemType *x);//出栈
bool GetTop(MyStack *S,int *x);//获取当前栈顶元素 
bool StackEmpty(MyStack *S);//栈判空 
bool BraketCheck(char a[],int length);//括号匹配 
//-------函数声明部分------ //


int main()
{
//	ElemType arr[] = "[]{[]}";
	ElemType arr[] = "[){[]}";
	if(BraketCheck(arr,sizeof(arr)-1))
		printf("匹配成功!");
	else
		printf("匹配失败!");
	return 0;
}

//栈的初始化 
void InitStack(MyStack *S)
{
	//栈的初始化需要把栈顶指针赋值为-1,此时栈中元素个数为0 
	S->top = -1;
} 

//入栈 
bool Push(MyStack *S,ElemType e)
{
	if(S->top == MaxSize -1) //如果栈满  也可以判断 length==MaxSize  
		return false;
	else 
		S->data[++S->top] = e;//指针先加一再将元素入栈  
	return true;
} 

//出栈
bool Pop(MyStack *S,ElemType *x)
{
	 
	if(S->top == -1)//栈空 
		return false;
	else
		*x = S->data[S->top--];//先获得元素,指针再执行--操作
	return true;
} 

//获取当前栈顶元素
bool GetTop(MyStack *S,int *x)
{
	if(S->top == -1)//如果栈空,则没有栈顶元素 
		return false;
	else
		*x = S->data[S->top];//获得栈顶元素 
	return true;
} 

//判断栈空 
bool StackEmpty(MyStack *S)
{
	return S->top==-1?true:false; 
}

//括号匹配 接收的参数:数组和数组的长度 
bool BraketCheck(ElemType str[],int length)
{
	MyStack 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 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);//全部匹配完后,栈空则说明匹配成功 
}

测试

image-20211104123855725

image-20211104123936932

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值