zoukankan      html  css  js  c++  java
  • 扩号匹配问题

    总时间限制: 1000ms  内存限制: 65536kB
    描述
    在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注.
    输入
    输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100
    注意:cin.getline(str,100)最多只能输入99个字符!
    输出
    对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。
    样例输入
    ((ABCD(x)
    )(rttyy())sss)(
    样例输出
    ((ABCD(x)
    $$
    )(rttyy())sss)(
    ?            ?$

    题目链接:http://ica.openjudge.cn/function2/5/

    分析:主要是用到栈,这里用数组直接模拟即可。栈里面保存字符串中左括号的下标。扫描字符串,遇到左括号则下标入栈,遇到右括号则检验栈是否为空,不为空则出栈并将对用的左右括号字符位置标记空格,否则将右括号字符对应位置标记“?”。

    扫描完成以后,再扫描栈,把多余的左括号字符对应位置标记“$”.

    代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 int main(int argc, char *argv[])
     4 {
     5     char str[110];
     6     int len,i,k;
     7     int stack[110],end=0;
     8     while(scanf("%s",str)!=EOF)
     9     {
    10         printf("%s
    ",str);
    11         end=0;
    12         len=strlen(str);
    13         for(i=0;i<len;i++)
    14         {
    15             if(str[i]!='('&&str[i]!=')') str[i]=' ';
    16         }
    17         for(i=0;i<len;i++)
    18         {
    19             if(str[i]=='(')
    20             {
    21                 stack[end]=i;
    22                 end++;
    23             }
    24             else if(str[i]==')')
    25             {
    26                 if(end>0)//栈不为空,则
    27                 {
    28                     k=stack[end-1];
    29                     str[k]=' ';//栈顶的左括号和新遇到的右括号匹配
    30                     str[i]=' ';
    31                     end--;//栈顶元素出栈 
    32                 }
    33                 else
    34                 {
    35                     str[i]='?';//右括号不匹配 
    36                 }
    37             }
    38         }
    39         while(end>0)
    40         {
    41             k=stack[end-1];
    42             str[k]='$';
    43             end--;
    44         }
    45         printf("%s
    ",str);
    46     }
    47     return 0;
    48 }

    递归的代码:

    递归的思路可以参考“排队游戏”这一题的递归代码:http://www.cnblogs.com/huashanqingzhu/p/7238768.html

     1 #include<stdio.h>
     2 #include<string.h>
     3 int fun(char *str,int len,int nowIndex);//nowIndex表示当前扫描到的字符下标。返回右括号的下标或-1 
     4 int count=0;//表示当前已经递归保存的左括号的个数 
     5 int main(int argc, char *argv[])
     6 {
     7     char str[110];
     8     int len,i,k;
     9     while(scanf("%s",str)!=EOF)
    10     {
    11         printf("%s
    ",str);
    12         len=strlen(str);
    13         for(i=0;i<len;i++)
    14         {
    15             if(str[i]!='('&&str[i]!=')') str[i]=' ';
    16         }
    17         count=0;
    18         fun(str,len,0);
    19         printf("%s
    ",str);
    20     }
    21     return 0;
    22 }
    23 int fun(char *str,int len,int nowIndex)//nowIndex表示当前扫描到的字符下标。返回右括号的下标或-1
    24 {
    25     int temp;
    26     if(nowIndex<len)
    27     {
    28         if(str[nowIndex]==')') 
    29         {
    30             if(count>0)
    31                 return nowIndex;
    32             else 
    33             {
    34                 str[nowIndex]='?';
    35                 return fun(str,len,nowIndex+1);
    36             }
    37         }
    38         else if(str[nowIndex]==' ') 
    39             return fun(str,len,nowIndex+1);
    40         else 
    41         {
    42             count++;
    43             temp=fun(str,len,nowIndex+1);//获取当前左括号对应的右括号 
    44             if(temp!=-1)
    45             {
    46                 str[temp]=' ';
    47                 str[nowIndex]=' ';
    48                 count--;
    49                 return fun(str,len,temp+1);
    50             }
    51             else 
    52             {
    53                 str[nowIndex]='$';//temp==-1表示当前的左括号是多余的,不可匹配的 
    54                 return -1;
    55             }
    56         }
    57     }
    58     return -1;
    59 }
  • 相关阅读:
    django-ForeignKey,OneToOneField,ManyToManyField
    django-HttpResponse,render,redirect
    django-常见问题勘误
    django-个人网站之环境配置(一)
    django-表单之数据保存(七)
    django-表单之模型表单渲染(六)
    django-表单之手动渲染(五)
    Linux内核中_IO,_IOR,_IOW,_IOWR宏的用法与解析
    流媒体传输协议详解之---RTSP认证
    在YUV图像上根据背景色实现OSD反色
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/7239039.html
Copyright © 2011-2022 走看看