zoukankan      html  css  js  c++  java
  • 洛谷 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代码
  • 相关阅读:
    二十几岁的事情之一,缩小理想!
    mysql数据库建表分类字段--尽量少用字符串--原因探索
    Linux 提升逼格之 命令别名 分享
    git 认证问题之一的解决 : http ssh 互换
    rabbitmqctl 命令整理
    golang 用defer 捕获error 需小心
    Linux 常用命令 随口说
    随便记录几个点
    喜鹊开发者(The Magpie Developer)
    主流开放平台接口说明
  • 原文地址:https://www.cnblogs.com/New-ljx/p/11284700.html
Copyright © 2011-2022 走看看