1355:字符串匹配問題(strs)
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 11150 通過數: 3866
【題目描述】
字符串中只含有括號 (),[],<>,{}
,判斷輸入的字符串中括號是否匹配。如果括號有互相包含的形式,從內到外必須是<>,(),[],{}
,例如。輸入: [()]
輸出:YES
,而輸入([]),([)]
都應該輸出NO
。
【輸入】
第一行爲一個整數n,表示以下有多少個由括好組成的字符串。接下來的nn行,每行都是一個由括號組成的長度不超過255255的字符串。
【輸出】
在輸出文件中有n行,每行都是YES
或NO
。
【輸入樣例】
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
{}{}<><>()()[][]
{
{}}{
{}}<<>><<>>(())(())[[]][[]]
{
{}}{
{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{
{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
*/
還可用字符組來模擬棧