• 括号配对问题 (栈的应用)


    Description

    You are given string s consists of opening and closing brackets of four kinds <>, {}, [], (). There are two types of brackets: opening and closing. You can replace any bracket by another of the same type. For example, you can replace < by the bracket {, but you can't replace it by ) or >.

    The following definition of a regular bracket sequence is well-known, so you can be familiar with it.

    Let's define a regular bracket sequence (RBS). Empty string is RBS. Let s1 and s2 be a RBS then the strings <s1>s2{s1}s2[s1]s2,(s1)s2 are also RBS.

    For example the string "[[(){}]<>]" is RBS, but the strings "[)()" and "][()()" are not.

    Determine the least number of replaces to make the string s RBS.

    Input

    The only line contains a non empty string s, consisting of only opening and closing brackets of four kinds. The length of s does not exceed 106.

    Output

    If it's impossible to get RBS from s print Impossible.

    Otherwise print the least number of replaces needed to get RBS from s.

    Sample Input

    Input

    [<}){}

    Output

    2

    Input

    {()}[]

    Output

    0

    Input

    ]]

    Output

    Impossible

    题意:
        输入一个有括号组成的字符串,只可以改变左括号,算出最少要改变多少次才能使括号配对。
    方法:
        先输入一个字符串s,计算字符串长度K,定义一个栈st,i从0到K,如果s[i]为右括号,判断栈是否为空,若为空输出Impossible,若st.top()为对应的左括号则删除,否则记录sum++表示要修改的次数。
      1 #include<cstdio>
      2 #include<stack>
      3 #include<string.h>
      4 using namespace std;
      5 int main()
      6 {
      7     char s[1000000+11];
      8     int k,sum;
      9     while(scanf("%s",&s)!=EOF)    
     10     {
     11     
     12         sum=0;
     13         stack<char>st;
     14         k=strlen(s);
     15         for(int i = 0; i < k ; i++)
     16         {
     17             if(s[i] == '>')
     18             {
     19                 if(st.empty())
     20                 {
     21                      printf("Impossible
    ");
     22                      sum=-1;
     23                      break;    
     24                 }
     25                 if(st.top() == '<')
     26                 {
     27                     st.pop();
     28                 }    
     29                 else
     30                 {
     31                     sum++;
     32                     st.pop();
     33                 }
     34             }
     35             else if(s[i] == ']')
     36             {
     37                 if(st.empty())
     38                 {
     39                      printf("Impossible
    ");
     40                      sum=-1;
     41                      break;        
     42                 }
     43                 if(st.top() == '[')
     44                 {
     45                     st.pop();
     46                 }
     47                 else
     48                 {
     49                     sum++;
     50                     st.pop();
     51                 }
     52             }
     53             else if(s[i] == ')')
     54             {
     55                 if(st.empty())
     56                 {
     57                      printf("Impossible
    ");
     58                      sum=-1;
     59                      break;        
     60                 }
     61                 if(st.top() == '(')
     62                 {
     63                     st.pop();
     64                 }
     65                 else
     66                 {
     67                     sum++;
     68                     st.pop();
     69                 }
     70             }
     71             else if(s[i] == '}')
     72             {
     73                 if(st.empty())
     74                 {
     75                      printf("Impossible
    ");
     76                      sum=-1;
     77                      break;        
     78                 }
     79                 if(st.top() == '{')
     80                 {
     81                     st.pop();
     82                 }
     83                 else
     84                 {
     85                     sum++;
     86                     st.pop();
     87                 }
     88             }
     89             else 
     90                 st.push(s[i]);
     91         }
     92         if(sum != -1)
     93         {
     94             if(!st.empty()) 
     95                  printf("Impossible
    ");
     96              else
     97                  printf("%d
    ",sum);
     98         }
     99     }
    100     
    101 }
     
    ——将来的你会感谢现在努力的自己。
  • 相关阅读:
    使用turtle库绘制一个叠加等边三角形
    使用turtle库绘制图形
    tar命令常用参数讲解
    elasticsearch 中geo point地理位置数据类型
    count(*)和count(1)的sql性能分析
    别再if/else走天下了
    正则表达式 匹配0次1次或者无限次
    linux shell 字符串操作(长度,查找,替换)
    linux expect工具使用
    mongodb分片balance
  • 原文地址:https://www.cnblogs.com/yexiaozi/p/5705237.html
Copyright © 2020-2023  润新知