洛谷 P1241 括号序列(栈)

嗯...

 

题目链接:https://www.luogu.org/problem/P1241

首先这道题是栈的入门题的加强版, 不仅要你判断这个括号序列是否合法,还要你将这个序列补充完整...

一开始是没有头绪的,看到tj之后恍然大悟...

 

思路:

我们假设所有的括号都是不合法的,即都没有匹配,然后我们从头扫一遍,对于左括号的处理比较简单:

把所有左括号的下标存入q这个手写栈,然后把所有左括号对应的右括号存入b数组中。

然后对于右括号的处理比较复杂:

如果先前的左括号都已匹配或者栈顶的左括号不与之匹配,那么将这个右括号匹配与其他匹配,即在b数组相应位置放一个左括号。如果匹配则将b数组中存的右括号清除。

输出时注意顺序...

AC代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 
 7 char s[105], b[105];
 8 int q[105], cnt;
 9 
10 int main(){
11     scanf("%s", s);
12     int l = strlen(s);
13     for(int i = 0; i < l; i++){
14         if(s[i] == '(') {q[++cnt] = i; b[i] = ')'; continue;}
15         if(s[i] == '[') {q[++cnt] = i; b[i] = ']'; continue;}
16         if(s[i] == ')' || s[i] == ']'){
17             if(!cnt || b[q[cnt]] != s[i]){
18                 if(s[i] == ')') b[i] = '(';
19                 else b[i] = '[';
20             }
21             else b[q[cnt--]] = ' ';
22         }
23     }
24     for(int i = 0; i < l; i++){
25         if(b[i] == '(' || b[i] == '[') printf("%c", b[i]);
26         printf("%c", s[i]);
27         if(b[i] == ')' || b[i] == ']') printf("%c", b[i]);
28     }
29     return 0;
30 }
AC代码
原文地址:https://www.cnblogs.com/New-ljx/p/11284700.html