本蒟蒻的第九篇题解,望大家多多见谅!
P
a
r
t
Part
Part
1
1
1 读题
题目描述:
为了让幻想乡的妖怪们更富有智慧,贤者八云紫决定在幻想乡开设计算机基础、C语言程序设计、数据结构等课程。琪露诺听说课上可以玩电脑,于是兴冲冲地把大妖精拉上,报名参加了C语言基础课程。
琪露诺当然什么都听不懂(毕竟她的智商只有⑨),所以每次上课她都全程跟大妖精玩昆特牌,下课后请其他妖怪帮她写作业。⑨个月后她把雾之湖所有的妖怪和妖精都委托了一遍,现在她找不到别人,只能再次找你了。
这次的作业是这样的:给你一个括号序列,其中有圆括号()、方括号[]、花括号{}和尖括号<>,请问该序列是否合法。
合法的括号序列可以按如下方式递归定义:
(1)空序列是合法的;
(2)若A和B是合法的括号序列,则AB(将B连接到A的后方)也是合法的括号序列;
(3)若A是合法的括号序列,则在两端添加一对括号,( A )、[ A ]、{ A }、< A >
都是合法的括号序列。
输入格式:
第一行是一个正整数
T
T
T,表示数据组数;
之后
T
T
T行,每行包含一个字符串,表示待判断的括号序列。保证字符串非空且只会包含()[]{}<>这8种字符。
输出格式:
对于每组数据,若该序列是合法的则输出
Y
e
s
Yes
Yes,否则输出
N
o
No
No。
输入样例:
3
(([]))
([(]))
{<><>}<{{(}}>)
输出样例:
Yes
No
No
P a r t Part Part 2 2 2 思路
我们要对左右括号值匹配,如果相同输出“ Y E S YES YES”,不同输出“ N O NO NO”。
P a r t Part Part 3 3 3 代码
栈:
#include<bits/stdc++.h>
using namespace std;
char str[1000005],stk[1000005];
int main(){
int n,top=0;
scanf("%d",&n);
for(int k=1;k<=n;k++){
top=0;
scanf("%s",str);
int l=strlen(str);
for(int i=0;i<=l;i++){
if(str[i]=='('){
stk[++top]=1;
}
if(str[i]=='['){
stk[++top]=2;
}
if(str[i]=='<'){
stk[++top]=3;
}
if(str[i]=='{'){
stk[++top]=4;
}
if(str[i]==')'){
if(top>0){
if(stk[top]==1){
stk[top]==0;
top--;
}
}
else {
printf("No\n");
break;
}
}
if(str[i]==']'){
if(top>0){
if(stk[top]==2){
stk[top]==0;
top--;
}
else{
printf("No\n");
break;
}
}
}
if(str[i]=='>'){
if(top>0){
if(stk[top]==3){
stk[top]==0;
top--;
}
}
else {
printf("No\n");
break;
}
}
if(str[i]=='}'){
if(top>0){
if(stk[top]==4){
stk[top]==0;
top--;
}
}
else {
printf("No\n");
break;
}
}
if(str[i]==str[l]){
if(top==0){
printf("Yes\n");
break;
}
else{
printf("No\n");
break;
}
}
}
}
return 0;
}
P a r t Part Part 4 4 4 总结
本题考查:
如果遇到左括号
如果栈空,则入栈。
如果栈不空
如果当前左括号优先级小于等于栈顶左括号优先级,左括号入栈。
否则不匹配。
如果遇到右括号
如果栈空,则不匹配。
如果栈不空
看栈顶左括号能否与该右括号配对,如果配对则出栈
否则不匹配。
看完题解后,会不会感到很简单呢?赶快去试试吧!