题目描述

北航2018级软件学院算法分析与设计第一次上机第三题

样例

实现解释

题目类型:

  这类题目其实就是典型的递归分析语句形式的问题,也是编译原理课程中语法分析的重要方法之一。

解决方案:

  为了解决这类问题,可以利用多函数递归调用的方法解决,针对本题即:编写两个函数分别用于判断是否为pair以及是否为type。(这里的是否为pair是指判断是否为一个完整的pair结构体)

  判断pair函数的构造原因是作为首次调用的函数,在其中调用其他的判断函数,并且由题意可知在判断type时也是需要判断pair,因此需要pair的判断程序能被再次调用,所以构造为一个完整的函数。

  而编写type判断函数的原因是它相比于其他出现的内容(这里指一个int),type是多选择(或者说可分解的)的,它可以转化为两种形式:一个完整的pair,单独的int,对于这两种选择又都有不同的去向,所以通过构造函数可以更好的判断句子的组成。

程序本身:

  回到程序本身,如何递归判断以及形成输出内容:这里推荐一个双向行走的方式,用两个字符数组或者两个string存储输入的字符串和要输出的字符串。为他们分别设定标记下标位置的向量。对于输入的字符串只需一次加一,不断读入后面的字符然后判断进入哪个判断程序即可;对输出的字符串则需要在判断结束后为其添加对应的输出内容(除了pair,int注意还要有<>,等字符)。

  具体实现可参考完整代码,这类题目结合代码参考较为容易。

坑点

1.后移下标判断字符串时多次移动,这里需要自己设定一个规则,即在函数的开头进行下标的移动还是在调用函数前进行下标的移动,否则容易出现略过字符的情况。

2.判断pair(即最初始的pair判断)时,注意一个pair判断完毕后需要进行再一步的判断,因为此时有三种情况:(1)pair是type转化为的pair(2)pair是最初始的pair且后续没有其他字符(3)pair是最初始的但后续出现其他字符。显然第三种是错误的,因为题目说了只有一个,所以需要在pair判断结束后依据下标对第三种情况进行筛选。(这里采用的是在初始调用的pair判断函数返回后判断下标和输入字符串的长度的关系,也是比较推荐的一种)

完整代码

#include<iostream>
#include<cstdio>
using namespace std;
int num;//输入字符串移动下标
int endnum;//输出字符串移动下标
string endString[3000];//输出字符串
//只能前面定义后面防止代码,因为涉及互相调用
bool checkT(string *a);//type判断函数
bool checkP(string *a);//pair判断函数
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
string temp;
string *a = new string[4000];
int i = 0;
for(int i =0;i<n;i++)
{
cin >> temp;
a[i] = temp;
//这里是一次传入一个字符串,如利用char数组可以传入一个P或者I这种首字母
}
num = 0;
endnum = 0;
if(checkP(a))
{
if(num == n-1)//判断一个pair后是否还有内容
{
for(int i = 0;i<endnum;i++)
{
cout << endString[i];
}
}
else
{
cout << "Error occurred";
}
}
else
{
cout << "Error occurred";
}
cout << endl;
delete [] a;
}
return 0;
}
bool checkT(string *a)//type判断函数
{
if(a[num] == "int")
{
endString[endnum++] = "int";
return true;
}
if(a[num] == "pair")
{
if(checkP(a))
{
return true;
}
}
return false;
}
bool checkP(string *a)//pair判断函数
{
if(a[num] == "pair")
{
num++;//采取的是调用函数前移动下标num的形式
endString[endnum++] = "pair";
endString[endnum++] = "<";
//输出字符串的增加直接endnum++个人感觉是最简便的形式
if(checkT(a))
{
num++;
endString[endnum++] = ",";
if(checkT(a))
{
endString[endnum++] = ">";
return true;
}
}
}
return false;
}

  

题解:2018级算法第一次上机 C1-pair的更多相关文章

  1. 北航2018级算法期末上机实录随笔1st

    简单记录下题目类型和做题情况,理性复习同时也希望提供一些参考 题目描述 共计八个题目,按照助教的划分,题目分类如下 一个签到(二分查找),两个板子(活动选择.KMP(洛谷kmp模板题)),一个板子变形 ...

  2. 题解:2018级算法第二次上机 Zexal的流水线问题

    题目描述: 样例: 实现解释: 最基础的流水线调度问题,甚至没有开始和结束的值 实现方法即得出状态转移方程后完善即可,设a[][i]存储着第一二条线上各家的时间花费,t[][i]存储着i处进行线路切换 ...

  3. 题解:2018级算法第五次上机 C5-图2

    题目描述: 样例: 实现解释: 所有结点对最短路径的板子题 知识点: 寻找所有结点对最短路径,动态规划 坑点: 无坑,注意建边即可 使用的算法为floyd算法 按照程序顺序解释如下: 首先建图,以邻接 ...

  4. 题解:2018级算法第二次上机 Zexal的竞赛

    题目描述: 样例: 实现解释: 一道需要一点思考的动态规划题目 知识点:动态规划,数据记录 首先将题目描述调整:分别输入不同分数的题目总分(便于后续计算),当获得了i分数的总分后无法获得i-1和i+1 ...

  5. 题解:2018级算法第六次上机 C6-不Nan的过河

    题目描述: 样例: 实现解释: 一道因为没排序做了一个小时没做出来的二分答案模板题(手动呲牙) 知识点: 二分答案,最大值最小化 坑点: 排序,judge(mid)函数内计数的实现 其实从最长一步的最 ...

  6. 题解:2018级算法第六次上机 C6-危机合约

    题目描述 样例: 实现解释: 没想到你也是个刀客塔之二维DP 知识点: 动态规划,多条流水线调度?可以看做一种流水线调度 坑点: 输入内容的调整(*的特殊判定),开头结尾的调整策略 从题意可知,要做的 ...

  7. 题解:2018级算法第四次上机 C4-最小乘法

    题目描述: 样例: 实现解释: 和字符串处理结合的动态规划,个人认为比较难分析出状态转移方程,虽然懂了之后挺好理解的 知识点: 动态规划,字符串转数字 题目分析: 首先按照最基础:依据题意设计原始dp ...

  8. 题解:2018级算法第四次上机 C4-商人卖鱼

    题目描述: 样例: 实现解释: 需要简单分析的贪心题 知识点: 贪心,自定义排序,提前存储 题目分析: 卖鱼,鱼卖出去需要时间,鱼没被卖出去之前需要吃饲料 则有,如果卖a鱼的话b鱼会吃饲料c份,而卖b ...

  9. 题解:2018级算法第三次上机 C3-Zexal的浩瀚星辰

    题目描述: 样例: 实现解释: 一道结合了火箭发射的贪心题目 知识点: 贪心,优先队列 题目分析: 根据题目描述可知,延迟后时间是正常推进的,也就是假设共有n个火箭,推迟k小时.则在到达k+1小时时, ...

随机推荐

  1. IE6、IE7兼容querySelectorAll和querySelector方法

    querySelector 和 querySelectorAll 方法是 W3C Selectors API 规范中定义的.他们的作用是根据 CSS 选择器规范,便捷定位文档中指定元素. 目前几乎主流 ...

  2. 使用VBS实现SSH远程登录并自动执行命令

    set ws=createobject("wscript.shell")ws.run "Putty所在路径\putty.exe -ssh -pw 你的密码 用户名@192 ...

  3. JavaScript 定时器 取消定时器

    感谢:链接(视频讲解很清晰) 定时器:作用主要是一定时间间隔后,做出相关的变化,例如图片轮播. 目录 两种定时器的使用 两种定时器区别 取消定时器的方法 两种定时器的使用: 方法一:setTimeou ...

  4. 使用python解线性矩阵方程(numpy中的matrix类)

    这学期有一门运筹学,讲的两大块儿:线性优化和非线性优化问题.在非线性优化问题这里涉及到拉格朗日乘子法,经常要算一些非常变态的线性方程,于是我就想用python求解线性方程.查阅资料的过程中找到了一个极 ...

  5. 基于node的前端项目编译时内存溢出问题

    解决方法: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory JavaScript堆内存不足,这里说的 Jav ...

  6. Beta冲刺<1/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第一天(05.19) 作业正文 如下 其他参考文献 ... B ...

  7. python django mkdir和makedirs的用法

    总结一下mkdir和makedirs的用法:      1.mkdir( path [,mode] )      作用:创建一个目录,可以是相对或者绝对路径,mode的默认模式是0777.      ...

  8. HTTP协议简要

    HTTP协议简要 HTTP协议是指超文本传输协议,简单来说就是一种规则,允许将HTML文档从Web服务器传送到Web浏览器. HTTP请求 HTTP请求包括三部分:请求行(请求方法),请求头(消息报头 ...

  9. Golang简易入门教程——面向对象篇

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第9篇文章,我们一起来看看golang当中的面向对象的部分. 在现在高级语言当中,面向对象几乎是不可或缺也是一门语言 ...

  10. java面试必备知识点-上中下三篇写的很详细

    参考博客:写的还是相当的经典 http://www.cnblogs.com/absfree/p/5568849.html 上中下三篇写的很详细 http://blog.csdn.net/riverfl ...