如何使用栈来实现括号匹配?(C语言)

如何判断一串由括号组成的字符串是否合法呢?即每个左括号都有一个对应的右括号与之匹配。

例如:[(())]({()})

首先我们试着分析一下这个字符串:

1.第第一个括号是‘[’,我们希望下一个是‘]’,则可以进行匹配,但是第二个是‘(’,不匹配,所以我们先将第一个括号放在一边。

2,对于第二个括号我们需要‘)’进行匹配,但是第三个括号是‘(’,并不匹配,所以将第二个括号也暂时放在一边

3,我们进行第三个括号的处理,我们需要一个‘)’,第四个括号刚好为‘)’,所以匹配成功,我们继续进行,此时我们需要对前一步中的第二个括号进行处理

4,第二个括号需要‘)’,我们可以发现第五个括号刚好是‘)’,所以匹配成功,我们继续处理前一个未处理的括号,即第一个括号‘[’

5,第一个括号需要‘]’,我们往后处理发现第六个括号是‘]’,匹配成功,继续往后处理

继续后面的步骤同上面的思想即可得。

对于上述过程,我们可以使用栈的思想进行实现。

我们可以进行一下演示:处理字符串:[(())]({()})

步骤要处理的字符动作栈中内容
1‘[’栈中为空,所以将它压入栈中

2‘(’与栈顶元素‘[’不匹配,将它压入栈中,暂不处理
[

3'('栈顶元素为‘(’,和当前处理字符不匹配,所以压入栈中
(
[

4')'与栈顶元素‘(’,匹配,所以将栈顶元素‘(’出栈,与当前处理字符配对
(
(
[

5‘)’与栈顶元素‘(’,匹配,所以将栈顶元素‘(’出栈,与当前处理字符配对
(
[

6']'与栈顶元素‘[’,匹配,所以将栈顶元素‘]’出栈,与当前处理字符配对
[

7'('当前栈为空,所以将它压入栈中,暂不处理

8‘{’栈顶元素为‘(’,和当前处理字符不匹配,所以压入栈中

9‘(’栈顶元素为‘{’,和当前处理字符不匹配,所以压入栈中
 {  

10‘)’与栈顶元素‘(’,匹配,所以将栈顶元素‘(’出栈,与当前处理字符配对
  {  

11‘}’与栈顶元素‘{’,匹配,所以将栈顶元素‘{’出栈,与当前处理字符配对
 {  

12‘)’与栈顶元素‘(’,匹配,所以将栈顶元素‘(’出栈,与当前处理字符配对
 

13处理结束栈为空所以可判断当前括号字符串合法

所以我们对这个字符串处理的结果就是,如果最后处理结束后栈中元素为空,就代表所有括号均合法匹配到,字符串是合法的。

当然对于不合法的情况有,如果读入的右括号和栈顶元素左括号不匹配就代表匹配失败;如果匹配结束,栈中仍有元素则也表示字符串不合法。

代码实现如下:

#include<stdio.h>
#include"malloc.h"
typedef struct LinkNode{
	char c;
	struct LinkNode *next;
}LinkNode,*LiStack;
//带头节点的栈初始化 
bool InitStack(LiStack &Ls){
	Ls=(LinkNode *)malloc(sizeof(LinkNode));
	if(Ls==NULL)return false;
	Ls->next=NULL;
	return true;
}
//进栈操作
void Push(LiStack &Ls,char c) {
	LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
	s->c=c;
	s->next=Ls->next;
	Ls->next=s;
}
//出栈操作
bool Pop(LiStack &Ls,char &c){
	if(Ls->next==NULL)return false;
	c=Ls->next->c;
	LinkNode *q=Ls->next;
	Ls->next=q->next;
	free(q);
	return true;
} 
//判断栈是否为空
bool IsEmpty(LiStack &Ls)
{
	return Ls->next==NULL; 
 } 
//进行括号匹配
bool IsCatch(){
	char c;
	LiStack Ls;
	if(InitStack(Ls));{
		while((c=getchar())!='\n'){
		if(c=='('||c=='['||c=='{'){
			Push(Ls,c);
		}
		else{
			char d;
			if(!Pop(Ls,d))return false;
			if(d!='('&&c==')')return false;
			if(c=='['&&d!=']')return false;
			if(c=='{'&&d!='}')return false;
		}
	}
	return IsEmpty(Ls);
	}
	return false;
} 
int main(){

	if(IsCatch()){
		printf("成功\n"); 
	}
	else printf("失败\n");
	return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值