括号序列
发布日期:2021-05-07 06:54:33 浏览次数:20 分类:精选文章

本文共 1471 字,大约阅读时间需要 4 分钟。

括 号 序 列 括号序列

题目链接:

题目

定义如下规则序列(字符串):

  1. 空序列是规则序列
  2. 如果 S S S是规则序列,那么 ( S ) (S) (S) [ S ] [S] [S]也是规则序列
  3. 如果 A A A B B B都是规则序列,那么 A B AB AB也是规则序列

例如,下面的字符串都是规则序列:

( ) () () [ ] [] [] ( ( ) ) (()) (()) ( [ ] ) ([]) ([]) ( ) [ ] ()[] ()[] ( ) [ ( ) ] ()[()] ()[()]

而以下几个则不是:

( ( ( [ [ [ ] ] ] ) ( )( )( ( ) ) ()) ()) ( [ ( ) ([() ([()

现在,给你一些由 ‘ ( ’ ‘(’ ( ‘ ) ’ ‘)’ ) ‘ [ ’ ‘[’ [ ‘ ] ’ ‘]’ ]构成的序列,你要做的,是补全该括号序列,即扫描一遍原序列,对每一个右括号,找到在它左边最靠近它的左括号匹配,如果没有就放弃。在以这种方式把原序列匹配完成后,把剩下的未匹配的括号补全。

输入

输入文件仅一行,全部由 ‘ ( ’ ‘(’ ( ‘ ) ’ ‘)’ ) ‘ [ ’ ‘[’ [ ‘ ] ’ ‘]’ ]组成,没有其他字符,长度不超过 100 100 100

输出

输出文件也仅有一行,全部由 ‘ ( ’ ‘(’ ( ‘ ) ’ ‘)’ ) ‘ [ ’ ‘[’ [ ‘ ] ’ ‘]’ ]组成,没有其他字符,把你补全后的规则序列输出即可。

样例输入

([()

样例输出

()[]()

样例解释

将前两个左括号补全即可。

思路

这道题直接用栈模拟。

把不能配对的找出来,然后输出时在输出字符串的同时输出要配对的字符的配对字符,就可以了。

代码

#include
#include
using namespace std;int c[101];char a[101], b[101];int main() { scanf("%s", &a);//读入 for (int i = 0; i < strlen(a); i++) { if (a[i] == '(') c[++c[0]] = i, b[i] = ')';//记录为左小括号 else if (a[i] == '[') c[++c[0]] = i, b[i] = ']';//记录为左中括号 else { if (!c[0] || b[c[c[0]]] != a[i]) { //不能能配对 if (a[i] == ')') b[i] = '(';//记录为右小括号 else b[i] = '[';//记录为右中括号 } else b[c[c[0]--]] = ' ';//能配对 } } for (int i = 0; i < strlen(a); i++) { if (b[i] == '(' || b[i] == '[') printf("%c", b[i]);//多出来右括号 printf("%c", a[i]);//之前的数组 if (b[i] == ')' || b[i] == ']') printf("%c", b[i]);//多出来左括号 } return 0;}
上一篇:Java中的反射
下一篇:Map集合及其实现类

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月09日 18时07分03秒