2705:扩号匹配问题(递归与非递归)

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

非递归写法:(用栈模拟)

代码来源:http://blog.csdn.net/sjf0115/article/details/8675934

思路:

 1 #include<stdio.h>  
 2 #include<iostream>  
 3 #include<stack>  
 4 #include<string.h>  
 5 using namespace std;  
 6   
 7 int main()
 8 {
 9     int i;  
10     char str[101],Mark[101];  
11     while(scanf("%s",str) != EOF)
12     {  
13         stack<char> S;  
14         for(i = 0;i < strlen(str);i++)
15         {
16             //如果是'('则入栈  
17             if(str[i] == '(')
18             {
19                 //将数组下表暂存在栈中  
20                 S.push(i);  
21                 //对应输出字符串暂且为' '  
22                 Mark[i] = ' ';  
23             }
24             else if(str[i] == ')')
25             {
26                 //如果没有'('相匹配  
27                 if(S.empty())
28                 {  //对应输出字符串改为'?' 
29                     Mark[i] = '?';  
30                 }
31                 else//有'('相匹配
32                 {
33                     //对应输出字符串改为' '  
34                     Mark[i] = ' ';  
35                     //栈顶位置左括号与其匹配,弹出已经匹配的左括号  
36                     S.pop();  
37                 }
38             }
39             //其他字符需许考虑,与括号无关  
40             else
41             {
42                 Mark[i] = ' ';   
43             }
44         }//for
45         //若栈非空,则有没有匹配的左括号  
46         while(!S.empty())
47         {  
48             //对应输出字符串改为'$'  
49             Mark[S.top()] = '$';  
50             S.pop();  
51         }
52         Mark[i] = '\0';  
53         //输出  
54         puts(str);  
55         puts(Mark);  
56     }
57     return 0;  
58 }  
View Code

递归写法:

(代码来源:http://blog.csdn.net/dreamchaseryx/article/details/41213459)

思路:在每一个递归层次都扫描剩余的字符串,遇到左括号进入下一层递归;遇到右括号则标记空格,并返回右括号下一个位置的下标;否则标记该左括号为匹配失败。

 1     #include<iostream>  
 2     #include<cstring>  
 3     using namespace std;  
 4       
 5     int pp(int);  
 6     char c[300] =  
 7     { };  
 8     int l;  
 9     int main()  
10     {  
11       
12         while (cin.getline(c, 120))  
13         {  
14             cout<<c<<endl;  
15             l = strlen(c);  
16             int i;  
17             for (i = 0; i < l; i++)  
18                 if (c[i] != '(' && c[i] != ')')  
19                     c[i] = ' ';  
20             i = 0;  
21             while (c[i] != 0)  
22             {  
23                 while (c[i] != '(' && c[i] != 0)  
24                     i++;  
25                 if (c[i] == '(')  
26                     i = pp(i);  
27             }  
28             i = 0;  
29             while (c[i] != 0)  
30             {  
31                 if (c[i] == ')')  
32                     c[i] = '?';  
33                 i++;  
34             }  
35             cout << c << endl;  
36         }  
37         return 0;  
38     }  
39       
40     int pp(int pos)  
41     {  
42         int i;  
43         i = pos + 1;  
44         while (1)  
45         {  
46             while (c[i] != '(' && c[i] != ')' && c[i] != 0)  
47                 i++;  
48             if (c[i] == '(')  
49             {  
50                 i = pp(i);  
51             }  
52             else if (c[i] == ')')  
53             {  
54                 c[pos] = ' ';  
55                 c[i] = ' ';  
56                 return i + 1;  
57             }  
58             else  
59             {  
60                 c[pos] = '$';  
61                 return l;  
62             }  
63         }  
64     }  
View Code

 

相关文章
|
6月前
|
机器学习/深度学习 人工智能 数据可视化
智谱AI新突破!GLM-Z1-Rumination:新一代沉思模型,推动AI助手进入"高智商+高自主"的新阶段
GLM-Z1-Rumination是智谱推出的新一代沉思模型,通过扩展强化学习训练实现长程推理能力,支持动态工具调用与自我验证机制,显著提升AI自主研究能力。
312 13
智谱AI新突破!GLM-Z1-Rumination:新一代沉思模型,推动AI助手进入"高智商+高自主"的新阶段
|
9月前
|
安全 数据库 数据安全/隐私保护
处理用户输入数据格式验证不通过的情况时,如何给出友好的提示信息?
处理用户输入数据格式验证不通过的情况时,如何给出友好的提示信息?
442 78
|
12月前
|
存储 关系型数据库 MySQL
什么是MyISAM和InnoDB
【10月更文挑战第17天】什么是MyISAM和InnoDB
152 0
|
11月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
445 5
|
11月前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
本文将带你领略Node.js的魅力,从基础概念到实践应用,一步步深入理解并掌握Node.js在后端开发中的运用。我们将通过实例学习如何搭建一个基本的Web服务,探讨Node.js的事件驱动和非阻塞I/O模型,以及如何利用其强大的生态系统进行高效的后端开发。无论你是前端开发者还是后端新手,这篇文章都会为你打开一扇通往全栈开发的大门。
|
12月前
|
资源调度 数据可视化 大数据
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(二)
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(二)
136 4
|
12月前
|
算法 Java Go
深入了解堆排序算法
深入了解堆排序算法
216 1
|
存储 前端开发 开发工具
前端常用的git操作
【8月更文挑战第24天】前端常用的git操作
119 1
基于simulink的模糊PID控制器建模与仿真,并对比PID控制器
在MATLAB 2022a的Simulink中,构建了模糊PID和标准PID控制器模型,对比两者控制输出。模糊控制器采用模糊逻辑处理误差和误差变化率,通过模糊化、推理和去模糊化调整PID参数。模糊PID能更好地应对非线性和不确定性,而标准PID虽然简单易实现,但对复杂系统控制可能不足。通过仿真分析,可选择适合的控制器类型。
|
SQL 前端开发 Java
苍穹外卖》电商实战项目(java)知识点整理(下)
苍穹外卖》电商实战项目(java)知识点整理(下)
545 1