栈的应用——括号匹配问题


如果不了解栈可以先阅读 栈的知识这篇文章。

一. 问题描述

在这里插入图片描述
可以自己先动手试试这道题,效果会更好
题目链接:力扣:有效的括号

二.问题分析

这个题可成“括号的消除”,字符串中离得最近并且同类型的一对括号优先进行消除,直至不能再消除,如果字符串最后变成空字符串,说明是有效字符串,否则是无效字符串。
在这里插入图片描述
为什么这个题会用到栈这个结构体呢?栈的特点是先进后出,所以这个题必定和先进后出有关系。
在这里插入图片描述

三.解题思路

思路:从左至右扫描字符串,如果当前字符为左括号入栈,如果该字符为右括号,栈的栈顶元素出栈该字符与栈顶元素进行比较,若为同类型括号则可以”消除“,继续扫描。如果不为同类型,直接返回false,表示为无效字符串。

一.匹配成功

在这里插入图片描述

二.匹配不成功

1.第一种情况

在这里插入图片描述

2.第二种情况:

在这里插入图片描述

3.第三种情况

在这里插入图片描述

三. 流程图

在这里插入图片描述

四.代码分析

#include<stdio.h>
#include<string.h>
#include<stdbool.h>//包含bool函数的头文件
char pipei(char a)
{
	if (a == '(')
		return ')';
    else if (a == '{')
		return '}';
	else if (a == '[')
		return ']';
	return 0;
}
//这个函数用来查找左括号对应的右括号
bool test(char str[])
{
	int n = strlen(str);
	char stk[n];
	int top = 0;
    if(n%2!=0)
        return false;
    //有效的字符串中的括号是成对出现,所以长度为偶数
	for (int i = 0; i < n; i++)
	{
		char c = str[i];
		if (pipei(c))	
		//如果不返回0,说明字符为左括号
			stk[top++]=c;
		//把左括号入栈
		else if (top == 0 || pipei(stk[--top])!=c)
			return false;
		//如果该符号是右括号并且栈为空,返回false。
		//或者该符号是右括号并且栈顶符号(左括号)和该符号不匹配,返回false。
	}
	return top==0;
	//扫描完整个字符串后如果栈顶top为0,说明栈为空,为有效字符串。
}
int main()
{
	char str[10];
	scanf("%s",str);
	if(test(str))
		printf("true");
	else
		printf("false");
}

五.运行结果

在这里插入图片描述
希望我的分享能让您有所启发,也希望你能献上自己宝贵的建议!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值