括号平衡
内存限制: 128 MiB时间限制: 1000 ms标准输入输出题目类型: 传统评测方式: 文本比较
题目描述
在本题中,题目会先给你一个包含小括号() 及中括号 [] 的字串。当字串符合下列条件时我们称它为正确的运算式:
1、 该字串为一个空字串。
2、 如果 A 和 B 都为正确的运算式,则 AB 也为正确的运算式。
3、 如果 A 为正确的运算式,则 (A) 及 [A] 都为正确的运算式。
现在,请你写一支程序可以读入这类字串并检查它们是否为正确的运算式。
输入格式
第一行为正整数 ,代表接下来有 个字符串。
接下来的 行,每行是一个仅含小括号和中括号的字符串(长度不大于 10000)。
输出格式
针对每个输入的括号字符串,如果是正确的运算式,则输出 "Yes",否则输出 "No"。
样例
输入样例
复制4
([])
(([()])))
([()[]()])()
([)]
输出样例
复制Yes
No
Yes
No
数据范围与提示
1 <= n <= 100
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10005;
char a[maxn], s[maxn];
int size, top, n;
void init() {
size = maxn;
top = 0;
}
bool empty() {
return top == 0;
}
bool full() {
return top == size;
}
void push(char x) {
a[top++] = x;
}
void pop() {
top--;
}
char TOP() {
return a[top - 1];
}
int main() {
scanf("%d", &n);
while(n--) {
init();
scanf("\n%s", s);
int len = strlen(s);
bool flag = true;
for(int i = 0; i < len; i++) {
if(s[i] == '(' || s[i] == '[') {
push(s[i]);
} else if(empty() == false && ((TOP() == '(' && s[i] == ')') || (TOP() == '[' && s[i] == ']'))) {
pop();
} else {
flag = false;
printf("No\n");
break;
}
}
if(flag == true && empty() == true) {
printf("Yes\n");
} else if(flag == true) {
printf("No\n");
}
}
return 0;
}
这篇是手打栈,用STL模板的在下面:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10005;
char s[maxn];
int n;
stack<char> a;
int main() {
scanf("%d", &n);
while(n--) {
while(a.empty() == false) {
a.pop();
}
scanf("\n%s", s);
int len = strlen(s);
bool flag = true;
for(int i = 0; i < len; i++) {
if(s[i] == '(' || s[i] == '[') {
a.push(s[i]);
} else if(a.empty() == false && ((a.top() == '(' && s[i] == ')') || (a.top() == '[' && s[i] == ']'))) {
a.pop();
} else {
flag = false;
printf("No\n");
break;
}
}
if(flag == true && a.empty() == true) {
printf("Yes\n");
} else if(flag == true) {
printf("No\n");
}
}
return 0;
}