匹配括号(平衡括号序列)

平衡括号序列的定义

括号序列是由()构成的序列。平衡的括号序列要求()出现次数一样多,而且序列的每个前缀里(的出现次数不低于)的出现次数。

解法

首先创建一个栈,当遇见(时入栈,若遇见),则查看当前栈顶有没有(跟它匹配,若有则使(出栈,若没有则说明当前的 前缀出现(的出现次数低于)的出现次数的情况 直接输出Invalid,否则使(出栈,因为这里跟)抵消了。遍历完毕则说明该序列任意前缀里(的出现次数不低于)的出现次数,输出Valid
当然了,最后还得判断一下栈是否为空(要不然给你(((((((,程序会算它对的)。

代码

#include <iostream>
#include <stack>
using namespace std;
int main() {
	stack<char> pr;
	string s;
	cin >> s;
	for (auto i: s) {
		if (i == '(') pr.push('(');
		else if (pr.top() != '(') {
			puts("Invalid");
			return 0;
		} else pr.pop();
	}
	if (pr.empty()) puts("Valid");
	else puts("Invalid");
	return 0;
}

进阶版

这次还有[]需要处理,办法如上:
首先创建一个栈,当遇见[时入栈,若遇见],则查看当前栈顶有没有[跟它匹配,若有则使[出栈,若没有则说明当前的 前缀出现[的出现次数低于]的出现次数的情况 直接输出Invalid,否则使[出栈,因为这里跟]抵消了。遍历完毕则说明该序列任意前缀里[的出现次数不低于]的出现次数,输出Valid

代码:

#include <iostream>
#include <stack>
using namespace std;
int main() {
	stack<char> pr;
	string s;
	cin >> s;
	for (auto i: s) {
		if (i == '(') pr.push('(');
		else if (i == '[') pr.push('[');
		else if (i == ')') {
			if (pr.top() != '(') {
				puts("Invalid");
				return 0;
			else pr.pop();
		} else if (i == ']') {
			if (pr.top() != '[') {
				puts("Invalid");
				return 0;
			else pr.pop();
		}
	}
	if (pr.empty()) puts("Valid");
	else puts("Invalid");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值