数据结构栈来实现括号匹配c++

hello大家好!许久不见,今天我们来讲一下c++中的经典问题——括号匹配

文章不长,但全是干货,,超详细教学,包你一听就会

知识准备:栈的相关知识 、多重循环、结构体、字符串

好了废话不多说让我们一起分析吧:

1.题目要我们输入一串括号并判断是否合法,那么我们不能得出(),(()),()()等诸如此类的都是合法的,同样)(,))((,(()))是不合法的,所以我们可以发现左括号一定要在右括号前,并且二者的数量一定要相等

2.这里我们就来考虑有哪些数据结构可以帮我们解决问题,突然栈的影子从大脑一闪而过,我们可以得出一种简单的想法:开一个char类型的栈,一旦遇见左括号就存进去,一旦遇见右括号就弹出,最后判断栈是否为空就可以判断是否合法

有了思想,现在让我们来想想怎么用代码实现:

首先是最基础的代码准备

考虑到数据范围和输入输出格式,这里我们选择用结构体来储存字符串,再开一个char类型的栈,准备用来装左括号

准备工作完成,现在让我们一起进入main主函数中,输入T,代表有T组数据等待判断,随后输入第i个字符串

好那么此时让我们一起开始对这T组数据的判断,这里用到了双重循环for来实现对第i个字符串的第j位括号的处理,注意对字符串取长度的函数是.length().size()。接下来我们开始枚举第i个字符串的每一位,遇到左括号就存栈,遇到右括号就出栈。注意这里有一个特判:如果一开始就是右括号,那么就直接break,输出不合法,开始对下个字符串的判断,这样更省时省力,自己想想为什么可以这样。

判断完之后就是输出了,我们想一想什么是合法?没错,当符合左前右后且操作后栈为空的才合法。所以空栈就输出Yes,否则则输出No。(这里用到判断栈是否为空的函数.empty()

此时我们却忽略了开头是右括号的情况,我们刚刚说开头是右括号的话可以直接break掉并输出No但是我们可以看到break后因为它是空栈,所以会输出Yes,与我们想的不一样,所以我们需要对右括号判断的语句进行修改。(自己想想为什么这么改,改了有什么好处)

可以看到我们仅是添加了一行入栈右括号的操作,上述的问题便迎刃而解,你有没有想到呢?那么问题又来了,既然右括号开头不合法,那么必然会使下一次操作的栈不为空(上一次不合法的判断也会使如此),所以在我们进行下一次操作前一定要先清栈,我这里使用了while,只要栈不为空就一直pop掉。

好了分析到这里就结束了,不知道你有没有想到以上可能出现的问题呢?

完整代码如下:

#include <bits/stdc++.h>
using namespace std;
int T;
struct my
{
	string s;
}A[105];
stack <char> kuohao;
int main ()
{
	cin >> T;
	for (int i = 0;i < T;i++)
		cin >> A[i].s;
	for (int i = 0;i < T;i++)
	{
		while (!kuohao.empty())
			kuohao.pop();
		for (int j = 0;j < A[i].s.length();j++)
		{
			if (A[i].s[j] == '(')
				kuohao.push(A[i].s[j]);
			else if (A[i].s[j] == ')')
			{
				if (kuohao.empty())
				{
					kuohao.push(A[i].s[j]);
					break;
				}
				else
					kuohao.pop();
			}
		}
		if (kuohao.empty())
			cout << "Yes" << endl;
		else 
			cout << "No" << endl;
	}
	return 0;
}

都看到这了,不如给小编一个赞呗,你的支持就是小编坚持下去的动力,我们下次见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值