请编写程序检查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. CLion在项目里编译不同文件

    1. 在完整的项目下找到CMakeList.txt(项目配置文件) 2. Build 和 Run的目标在add_executable参数中 3. 将其修改为如下格式:add_executable(pr ...

  2. Head First设计模式分析学习

    永不放弃的毅力,和对欲望的控制. 注意:要能够理解相类似的设计模式之间的区别和不同.可以把类比列举出来,加深记忆. 是否加入Spring容器中的标准是是否要用到Spring框架的方法或者功能特性,如事 ...

  3. 初入机器学习,安装tensorflow包等问题总结

    学习python,机器学习(maching-lerning).深度学习(deep-learning)等概念也是耳熟能详.我最近从新手开始学习maching-learning知识,不过课程偏向基本的理论 ...

  4. 【OpenGL】GL_DEPTH_TEST深度测试问题

    记录一个深度测试的问题 在实现一个简单的OpenGL程序时,遇到了一个问题,深度测试总是有问题,无法正常显示,如下 正常情况为 通过调试发现屏幕空间中的所有深度值均为1. OpenGL代码如下: vo ...

  5. Git 分支设计规范

    概述 这篇文章分享 Git 分支设计规范,目的是提供给研发人员做参考. 规范是死的,人是活的,希望自己定的规范,不要被打脸. 在说 Git 分支规范之前,先说下在系统开发过程中常用的环境. 简称 全称 ...

  6. 使用sass语法生成自己的css的样式库

    前言 先说一下 sass 和 scss的区别 sass 是一种缩进语法(即没有花括号和分号,只使用换行 缩进的方式去区别子元素,PS:这是我个人的理解) scss 是css-like语法  (它的语法 ...

  7. 20200115--python学习第九天

    今日内容 三元运算 函数 考试题 1.三元运算(又称三目运算) v= 前面 if 条件 else 后面 if 条件: v = '前面' else: v ='后面' 示例:让用户输入值,如果值是整数,则 ...

  8. css横竖屏适配

    Css做到横竖屏适配:定义两个样式 { @media screen and (orientation: portrait){ Css[竖向定义样式] } @media screen and (orie ...

  9. 如何在GitHub预览html

    1.在GitHub中找到需要预览的html文件,点击settings 2.找到GitHub Pages,将其中的source改为master branch,此时出现了下图中的红色链接,打开一个新的网页 ...

  10. 伪造TGT黄金票据

    通过上一篇文章我们初步了解了Kerberos协议的工作过程,解决的两个问题 第一个问题:如何证明你本人是XXX用户的问题   由Authentication Server负责 第二个问题:提供服务的服 ...