1355:字符串匹配问题(strs)时间限制: 1000 ms 内存限制: 65536 KB 提交数: 11809 通过数: 4081 【题目描述】设字符串中只含有括号 【输入】第一行为一个整数nn,表示以下有多少个由括好组成的字符串。接下来的nn行,每行都是一个由括号组成的长度不超过255255的字符串。 【输出】在输出文件中有nn行,每行都是 【输入样例】 【输出样例】 |
教学备忘录:编辑 |
无 |
给学生提示:编辑 |
无 |
与一本通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
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
*/
还可用字符组来模拟栈