扩号匹配问题
Posted 寄蜉蝣于天地,渺沧海之一粟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扩号匹配问题相关的知识,希望对你有一定的参考价值。
- 总时间限制: 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\n",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\n",str); 46 } 47 return 0; 48 }
以上是关于扩号匹配问题的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 数据库 - 使用UEStudio修改dmp文件版本号,解决imp命令恢复的数据库与dmp本地文件版本号不匹配导致的导入失败问题,“ORACLE error 12547”问题处理(代码片段