请编写程序检查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++的更多相关文章

  1. PTA 7-2 符号配对(20 分)

    7-2 符号配对(20 分) 请编写程序检查C语言源程序中下列符号是否配对:/*与*/.(与).[与].{与}. 输入格式: 输入为一个C语言源程序.当读到某一行中只有一个句点.和一个回车的时候,标志 ...

  2. PTA 7-2 符号配对(栈模拟)

    请编写程序检查C语言源程序中下列符号是否配对:/*与*/.(与).[与].{与}. 输入格式: 输入为一个C语言源程序.当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束.程序中需要检查配对 ...

  3. PTA 7-2 符号配对

    直接用栈模拟即可,数组可做,但因为这节数据结构是栈,为了期末考试还是手写一下栈的操作,值得注意的是,这道题用gets函数在PTA上会编译错误,用scanf("%[^\n]", st ...

  4. DS博客作业03—栈和队列

    1.本周学习总结 本周学习了栈和队列两种数据结构,分别对应后进先出,先进先出两种数据操作 学会栈的特殊类型-共享栈,队列的特殊类型-循环队列的一系列操作 学会熟练使用栈和队列的STL容器,使代码简洁 ...

  5. DS03--栈和队列

    一.学习总结 1 关键词: 逻辑结构,存储结构,抽象数据类型,顺序存储类型,链式存储类型,线性表应用 栈和队列 2 使用思维导图将这些关键词组织起来. 二.PTA实验作业 2.1题目1:符号配对 请编 ...

  6. ms-dos中 MSCDEX命名语法详解

    一.MSCDEX的语法及参数:        MSCDEX可以在AUTOEXEC.BAT文件中自动加载,也可以在DOS的命令行中载入但要使用光驱,前提条件是在Config.sys文件中加载了光驱的驱动 ...

  7. 数据结构 栈&队列

    2-4 依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是( ) 删除,移动头指针: 增加,移动尾指针: 删除a,b ,队头c 2-3 在一个链队列中,fron ...

  8. PTA-栈(括弧匹配)

    #include<bits/stdc++.h> using namespace std; #define STACK_INIT_SIZE 10000 #define STACKINCREM ...

  9. Dev-cpp怎样去掉括号匹配?

    很多编C/C++的同学在用Dev-cpp的时候,就感觉到括号匹配很烦,又不知道哪里去掉. 所以,让ljn告诉你怎样去掉括号匹配. 1.打开Dev-cpp. 2.在菜单栏上,点击“工具[T]”,选择“编 ...

随机推荐

  1. ceph问题

    问题1: [root@admin-node my-cluster]# ceph -s cluster 4ca35731-2ccf-47fb-9f06-41fae858626d health HEALT ...

  2. JSP&Servlet学习笔记----第4章

    HTTP是基于请求/响应的无状态的通信协议. 使服务器记得此次请求与之后请求关系的方式,叫做会话管理. 隐藏域:由浏览器在每次请求时主动告知服务器多次请求间必要的信息.仅适用于一些简单的状态 管理,如 ...

  3. Java集合XMind与注意事项

    Java中集合使用时的几个注意事项: 1.ArrayList和HashMap都具有扩容 ArrayList初始化数组长度为10,扩容后的容量为原来的1.5倍. HashMap初始化的数组长度为16,扩 ...

  4. char *p=new char[n] delete[] p出错

    上面不delete不出错然后下面单个输入出现乱码

  5. CBAM(Convolutional Block Attention Module)使用指南

    转自知乎 这货就是基于 SE-Net [5]中的 Squeeze-and-Excitation module 来进行进一步拓展 具体来说,文中把 channel-wise attention 看成是教 ...

  6. Dapper系列 作者:懒懒的程序员一枚

    Dapper 第一篇简单介绍什么是小巧玲珑?Dapper如何工作安装需求方法参数结果常用类型 Dapper 第二篇 Execute 方法介绍描述存储过程Insert语句Update语句Delete语句 ...

  7. 全网最全小白搭建Hexo+Gitee/Coding

    全网最全小白搭建Hexo+Gitee/Coding 本站内容已全部转移到https://www.myyuns.ltd,具体请移步到www.myyuns.ltd查看

  8. Thread类的interrupted方法和isInterrupted方法的区别

    如下所示,interrupted()会改变线程的中断状态(清除),而isInterrupted()不影响线程的中断状态   /** * Tests whether the current thread ...

  9. 性能测试监控平台Grafana的使用

    Grafana的监控是基于数据库的,通过插件获取到服务器性能并存储到数据库中,然后使用Grafana连接数据库形成可视化的图表.本篇给大家介绍对服务器的性能的监控,下一篇会介绍对于mysql数据库的监 ...

  10. 交换机 路由器 防火墙asa 安全访问、配置 方式

    这里交换机 路由器 暂时统称为  网络设备 我们一般管理网络设备采用的几种方法 一般来说,可以用5种方式来设置路由器: 1. Console口接终端或运行终端仿真软件的微机(第一次配置要使用此方式) ...