代码源oj--数据结构初级:104括号序列
给定一个长度为 n 的字符串 s,字符串由 (, ), [, ]组成,问 s 是不是一个合法的括号序列。合法的括号序列的定义是:空串是一个合法的括号序列。若A是一个合法的括号序列,则(A),[A]也是合法的括号序列。若A,B都是合法的括号序列,则AB也是合法的括号序列。输入格式第一行一个整数 n。接下来一行一个长度为 n的字符串 s。输出格式如果 s 是合法的括号序列,输出 Yes,否则输出 No
·
给定一个长度为 n 的字符串 s,字符串由 (
, )
, [
, ]
组成,问 s 是不是一个合法的括号序列。
合法的括号序列的定义是:
-
空串是一个合法的括号序列。
-
若
A
是一个合法的括号序列,则(A)
,[A]
也是合法的括号序列。 -
若
A
,B
都是合法的括号序列,则AB
也是合法的括号序列。
输入格式
第一行一个整数 n。
接下来一行一个长度为 n的字符串 s。
输出格式
如果 s 是合法的括号序列,输出 Yes
,否则输出 No
。
样例输入1
10
[]([(())])
样例输出1
Yes
样例输入2
4
[(])
样例输出2
No
数据规模
对于所有数据,保证 n≤100000。
答案
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1e5+5;
char Stack[N];
int top=0;
char tmp;
int main(){
int n;
scanf("%d", &n);
getchar();
while(n--){
scanf("%c", &tmp);
if(tmp == '(' || tmp == '[') //左括号就入栈
Stack[++top] = tmp;
else if(tmp == ')'){ //发现右括号就判断栈顶的左括号能否与之匹配
if(Stack[top] == '(')
--top; //匹配就把栈顶左括号出栈
else{
printf("No"); //不匹配就直接结束程序
return 0;
}
}
else{
if(Stack[top] == '[')
--top;
else{
printf("No");
return 0;
}
}
}
if(top == 0) //最后这里还可能会出现一种情况:就是栈内只剩下左括号
printf("Yes"); //当然,这肯定是非法的,所以我们还需要判断栈是否为空
else //此时只有栈为空的情况下,输入的括号字符串序列才为合法的
printf("No");
return 0;
}

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)