检查括号匹配性(栈实现)

题意如图:

 给出一个字符串检验括号是否相匹配。

脑海里一个直接的想法就是我们计算左括号和右括号的总数,比较两个总数。

但是:

 这样的也满足上面的条件,所以这个思路行不通

除此之外,我们还要考虑每个左括号必须在它右边找到对应的右括号。

也就是:任何右括号应该对应离他最近的左括号。

思路:从左向右扫描表达式,记录所有未关闭的括号,每当我们碰到一个左括号,我们就把他加到列表中,每当我们碰到一个右括号,他应该对应列表里最后一个左括号。如果不一致,说明括号不匹配,或者如果列表为空,也说明括号不匹配。

什么容器刚好能实现这样的思路呢.明显是栈。

代码实现:

#include<iostream>
#include<string>
#include<stack>
using namespace std;

bool pipei(char c[],int n)
{
	stack<char> S;
	int i;
	for (i = 0;i < n;i++)//遍历表达式
	{
		if (c[i] == '(' || c[i] == '[' || c[i] == '{')//左括号
		{
			S.push(c[i]);//压入栈
		}
		else if (c[i] == ')' || c[i] == ']' || c[i] == '}')//右括号
		{
			if (S.empty())//判断栈是否为空
				return false;//栈空
			else//栈非空
			{
				if (c[i] == ')' && S.top() == '(')//和栈顶元素匹配就把栈顶元素删除
					S.pop();
				if (c[i] == ']' && S.top() == '[')
					S.pop();
				if (c[i] == '}' && S.top() == '{')
					S.pop();
			}
			return S.empty() ? true : false;//最后判断栈是否为空
		}
	}
}
int main()
{
	char c[1000];
	cin >> c;
	bool ret = pipei(c, strlen(c));
	if (ret)
		cout << "Matching!";
	else
		cout << "No matching!";
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xxx_xiyuyu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值