PTA 符号配对 —— C++
请编写程序检查C语言源程序中下列符号是否配对:/*
与 */
、(
与 )
、[
与]
、{
与}
。
输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点.
和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。
输出格式:
首先,如果所有符号配对正确,则在第一行中输出YES
,否则输出NO
。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号
;如果缺少右符号,则输出左符号-?
。
输入样例1:
void test()
{
int i, A[10];
for (i=0; i<10; i++) /*/
A[i] = i;
}
.
输出样例1:
NO
/*-?
输入样例2:
void test()
{
int i, A[10];
for (i=0; i<10; i++) /**/
A[i] = i;
}]
.
输出样例2:
NO
?-]
输入样例3:
void test()
{
int i
double A[10];
for (i=0; i<10; i++) /**/
A[i] = 0.1*i;
}
.
输出样例3:
YES
思路:首先,个人认为,这道题用栈是实现不了的。下图 AC 代码运行出来的结果,难道不应该是 {-? 吗???
然后就是我个人的思路,声明一个足够长的 char 数组 data ,按出现的先后顺序来存储 /*
*/
、(
)
、[
]
、{ }
这些符号,遇到其他符号,直接跳过
例如 void ( { ]
void 和空格直接跳过,
data[5] 存储 '(';
data[7] 存储 '{';
注意,第 10 位为右半部分符号 ‘]’,此时从第 9 位,倒序遍历 data ,若出现与之对应的左半部分符号,将左半部分符号删除,即 data[i]=NULL;若未出现,将右半部分符号存入第 10 位,以此方法,直到将输入语句遍历
最后从头遍历 data 直到出现第一个不为 NULL 的数据,输出与之相对的部分,若 data 全为空输出 “YES”
代码:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<char> v;
int main(){
string tem;
char data[] = { NULL };
int i, j;
while (getline(cin,tem)&&tem!="."){
for (i = ; i < tem.size(); i++)
v.push_back(tem[i]);
}
for (i = ; i < v.size(); i++) {
if (v[i] == '('|| v[i] == '['|| v[i] == '{')
data[i] = v[i];
else if ((i+)<v.size()&&v[i] == '/'&&v[i + ] == '*'){
data[i] = v[i];
i++;
}
else if ((i + ) < v.size() && v[i] == '*'&&v[i + ] == '/') {
for (j = i - ; j >= ; j--) {
if (data[j] == '/') {
data[j] = NULL;
break;
}
}
if(j==-)
data[i] = v[i];
i++;
}
else if (v[i] == '}') {
for (j = i - ; j >= ; j--) {
if (data[j] == '{') {
data[j] = NULL;
break;
}
}
if (j == -)
data[i] = v[i];
}
else if (v[i] == ']') {
for (j = i - ; j >= ; j--) {
if (data[j] == '[') {
data[j] = NULL;
break;
}
}
if (j == -)
data[i] = v[i];
}
else if (v[i] == ')') {
for (j = i - ; j >= ; j--) {
if (data[j] == '(') {
data[j] = NULL;
break;
}
}
if (j == -)
data[i] = v[i];
}
}
for (i = ; i < ; i++) {
if (data[i] != NULL) {
cout << "NO" << endl;
if (data[i] == '/')
cout << "/*-?" << endl;
else if (data[i] == '{')
cout << "{-?" << endl;
else if (data[i] == '[')
cout << "[-?" << endl;
else if (data[i] == '(')
cout << "(-?" << endl;
else if (data[i] == '*')
cout << "?-*/" << endl;
else if (data[i] == '}')
cout << "?-}" << endl;
else if (data[i] == ']')
cout << "?-]" << endl;
else if (data[i] == ')')
cout << "?-)" << endl;
break;
}
}
if (i==)
cout << "YES" << endl;
system("pause");
return ;
}
PTA 符号配对 —— C++的更多相关文章
- PTA 7-2 符号配对(20 分)
7-2 符号配对(20 分) 请编写程序检查C语言源程序中下列符号是否配对:/*与*/.(与).[与].{与}. 输入格式: 输入为一个C语言源程序.当读到某一行中只有一个句点.和一个回车的时候,标志 ...
- PTA 7-2 符号配对(栈模拟)
请编写程序检查C语言源程序中下列符号是否配对:/*与*/.(与).[与].{与}. 输入格式: 输入为一个C语言源程序.当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束.程序中需要检查配对 ...
- PTA 7-2 符号配对
直接用栈模拟即可,数组可做,但因为这节数据结构是栈,为了期末考试还是手写一下栈的操作,值得注意的是,这道题用gets函数在PTA上会编译错误,用scanf("%[^\n]", st ...
- DS博客作业03—栈和队列
1.本周学习总结 本周学习了栈和队列两种数据结构,分别对应后进先出,先进先出两种数据操作 学会栈的特殊类型-共享栈,队列的特殊类型-循环队列的一系列操作 学会熟练使用栈和队列的STL容器,使代码简洁 ...
- DS03--栈和队列
一.学习总结 1 关键词: 逻辑结构,存储结构,抽象数据类型,顺序存储类型,链式存储类型,线性表应用 栈和队列 2 使用思维导图将这些关键词组织起来. 二.PTA实验作业 2.1题目1:符号配对 请编 ...
- ms-dos中 MSCDEX命名语法详解
一.MSCDEX的语法及参数: MSCDEX可以在AUTOEXEC.BAT文件中自动加载,也可以在DOS的命令行中载入但要使用光驱,前提条件是在Config.sys文件中加载了光驱的驱动 ...
- 数据结构 栈&队列
2-4 依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是( ) 删除,移动头指针: 增加,移动尾指针: 删除a,b ,队头c 2-3 在一个链队列中,fron ...
- PTA-栈(括弧匹配)
#include<bits/stdc++.h> using namespace std; #define STACK_INIT_SIZE 10000 #define STACKINCREM ...
- Dev-cpp怎样去掉括号匹配?
很多编C/C++的同学在用Dev-cpp的时候,就感觉到括号匹配很烦,又不知道哪里去掉. 所以,让ljn告诉你怎样去掉括号匹配. 1.打开Dev-cpp. 2.在菜单栏上,点击“工具[T]”,选择“编 ...
随机推荐
- ceph问题
问题1: [root@admin-node my-cluster]# ceph -s cluster 4ca35731-2ccf-47fb-9f06-41fae858626d health HEALT ...
- JSP&Servlet学习笔记----第4章
HTTP是基于请求/响应的无状态的通信协议. 使服务器记得此次请求与之后请求关系的方式,叫做会话管理. 隐藏域:由浏览器在每次请求时主动告知服务器多次请求间必要的信息.仅适用于一些简单的状态 管理,如 ...
- Java集合XMind与注意事项
Java中集合使用时的几个注意事项: 1.ArrayList和HashMap都具有扩容 ArrayList初始化数组长度为10,扩容后的容量为原来的1.5倍. HashMap初始化的数组长度为16,扩 ...
- char *p=new char[n] delete[] p出错
上面不delete不出错然后下面单个输入出现乱码
- CBAM(Convolutional Block Attention Module)使用指南
转自知乎 这货就是基于 SE-Net [5]中的 Squeeze-and-Excitation module 来进行进一步拓展 具体来说,文中把 channel-wise attention 看成是教 ...
- Dapper系列 作者:懒懒的程序员一枚
Dapper 第一篇简单介绍什么是小巧玲珑?Dapper如何工作安装需求方法参数结果常用类型 Dapper 第二篇 Execute 方法介绍描述存储过程Insert语句Update语句Delete语句 ...
- 全网最全小白搭建Hexo+Gitee/Coding
全网最全小白搭建Hexo+Gitee/Coding 本站内容已全部转移到https://www.myyuns.ltd,具体请移步到www.myyuns.ltd查看
- Thread类的interrupted方法和isInterrupted方法的区别
如下所示,interrupted()会改变线程的中断状态(清除),而isInterrupted()不影响线程的中断状态 /** * Tests whether the current thread ...
- 性能测试监控平台Grafana的使用
Grafana的监控是基于数据库的,通过插件获取到服务器性能并存储到数据库中,然后使用Grafana连接数据库形成可视化的图表.本篇给大家介绍对服务器的性能的监控,下一篇会介绍对于mysql数据库的监 ...
- 交换机 路由器 防火墙asa 安全访问、配置 方式
这里交换机 路由器 暂时统称为 网络设备 我们一般管理网络设备采用的几种方法 一般来说,可以用5种方式来设置路由器: 1. Console口接终端或运行终端仿真软件的微机(第一次配置要使用此方式) ...