信息学奥赛一本通1355 字符串匹配问题(strs) (栈)

1355:字符串匹配问题(strs)


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 11809     通过数: 4081

【题目描述】

设字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]),([)]都应该输出NO

【输入】

第一行为一个整数nn,表示以下有多少个由括好组成的字符串。接下来的nn行,每行都是一个由括号组成的长度不超过255255的字符串。

【输出】

在输出文件中有nn行,每行都是YESNO

【输入样例】

5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]

【输出样例】

YES
YES
YES
YES
NO

提交 统计信息 提交记录


教学备忘录:编辑
给学生提示:编辑

与一本通1354题类似,

1. 左括号:

遇到 < 直接将其入栈,

遇到 ( 判断栈是否为空,

        栈为空判断栈顶元素是否为 < ;是 < 则括号不匹配;修改标记cnt为false;不是 < 则将 ( 入栈;

        栈不为空则将 ( 入栈;

遇到 [ 判断栈是否为空,

        栈为空判断栈顶元素是否为 < 或 ( ;是 < 或 ( 则括号不匹配;修改标记cnt为false;不是 < 或 ( 则将 [ 入栈;

        栈不为空则将 [ 入栈;

遇到 { 判断栈是否为空,

        栈为空判断栈顶元素是否为 < , ( 或 [ ;是 < , ( 或 [ 则括号不匹配;修改标记cnt为false;不是 < , ( 或 [ 则将 { 入栈;

        栈不为空则将 { 入栈;

2. 右括号:

遇到 > 判断栈是否为空,

        栈不为空判断栈顶元素是否为 < ;是 < 则此括号匹配;弹出栈顶元素;不是 < 则不匹配;修改标记cnt为false;

        栈为空则不匹配,将 cnt 修改为false;

遇到 ) 判断栈是否为空,

        栈不为空判断栈顶元素是否为 ( ;是 ( 则此括号匹配;弹出栈顶元素;不是 ( 则不匹配;修改标记cnt为false;

        栈为空则不匹配,将 cnt 修改为false;

遇到 ] 判断栈是否为空,

        栈不为空判断栈顶元素是否为 [ ;是 [ 则此括号匹配;弹出栈顶元素;不是 [ 则不匹配;修改标记cnt为false;

        栈为空则不匹配,将 cnt 修改为false;

遇到 } 判断栈是否为空,

        栈不为空判断栈顶元素是否为 { ;是 { 则此括号匹配;弹出栈顶元素;不是 { 则不匹配;修改标记cnt为false;

        栈为空则不匹配,将 cnt 修改为false;

最终只需判断栈为空且cnt为true便输出YES

否则输出NO

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

stack <char> s;

int main()
{
	string str;
	int n;
	int len;
	bool cnt;
	cin >> n;
	getchar();
	while (n --) {
		cin >> str;
		while (!s.empty()) s.pop();
		cnt = true;
		len = str.length();
		for (int i = 0; i < len; i ++) {
			if (str[i] == '<') {
				s.push(str[i]);
			}
			else if (str[i] == '(') {
				if (!s.empty()) { 
					if (s.top() == '<') {
						cnt = false;
						break;
					}
				}
				s.push(str[i]);
			}
			else if (str[i] == '[') {
				if (!s.empty()) { 
					if (s.top() == '(' || s.top() == '<') {
						cnt = false;
						break;
					}
				} 
				s.push(str[i]); 
			}
			else if (str[i] == '{') {
				if (!s.empty()) { 
					if (s.top() == '[' || s.top() == '(' || s.top() == '<') {
						cnt = false;
						break;
					}
				} 
				s.push(str[i]); 
			}
			else if (str[i] == '>') {
				if (!s.empty()) {
					if (s.top() == '<') {
						s.pop();
					}
					else {
						cnt = false;
						break;
					}
				} 
				else {
					cnt = false;
					break;
				}
			}
			else if (str[i] == ')') { 
				if (!s.empty()) {
					if (s.top() == '(') {
						s.pop();
					}
					else {
						cnt = false;
						break;
					}
				}
				else {
					cnt = false;
					break;
				}
				
			}
			else if (str[i] == ']') { 
				if (!s.empty()) {
					if (s.top() == '[') {
						s.pop();
					}
					else {
						cnt = false;
						break;
					}
				}
				else {
					cnt = false;
					break;
				}
			}
			else if (str[i] == '}') { 
				if (!s.empty()) {
					if (s.top() == '{') {
						s.pop();
					}
					else {
						cnt = false;
						break;
					}
				}
				else {
					cnt = false;
					break;
				}
			}
		}
		if (s.empty() && cnt) cout << "YES" << endl;
		else cout << "NO" << endl;
	}
	return 0;
}
/*
5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
*/

还可用字符组来模拟栈

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值