描述: 现在,有一行括号序列,请你检查这行括号是否配对。
输入
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
经典解法:是左括号则入栈,是右括号就先检查栈中是否为空,为空则失败,不为空则判断栈顶能否匹配,不能匹配则失败,能匹配则继续重复前面操作,最后若栈空,字符全部用完,且tag为true,则匹配。
<span style="font-size:18px;">#include<iostream>
using namespace std;
#include<cstring>
#include<cstdio>
int main() {
int count, n;
cin>>n;
string s[n];
char arr[10000];
int stack[10000];
char c;
int temp, top, limit;
for (int i = 0; i < n; i++) {
cin>>s[i];
getchar();
}
for (int i = 0; i < n; i++) {// represent group`s numeral;
limit = s[i].length();//取得当前处理字符的长度
strcpy(arr, s[i].c_str());//将字符串转化为字符数组
count = 0;
top = -1;
bool tag = true;//首先假设可以匹配,如果不匹配则改为false
while(count < limit) {//represent a specify group
c = arr[count++];
if(c == '(') {//左括号转换为负数,右括号转换为正数
temp = -1;
} else if (c == ')') {
temp = 1;
} else if (c == '[') {
temp = -2;
} else {
temp = 2;
}
if (temp < 0) {
stack[++top] = temp;
} else if (temp > 0 && top > -1) {//有右括号,也有左括号,继续匹配
if (0 != temp + stack[top--]) {//如果不能匹配,则失败
tag = false;
break;
}
} else {//只有右括号,无左括号,无法匹配
tag = false;
break;
}
}
if (count == limit && top == -1 && tag == true) {//需要tag是因为防止
cout << "Yes" << endl; //右边刚好比左边多一种的情况
} else {
cout << "No" << endl;
}
}
} </span>
测试: