1.本周学习总结(0--1分)
- 本周对栈和队列进行了学习,刚开始看上去还挺唬人的,但是开始写题之后发现,栈和队列无非就是两种结构而已,还有stack()和queue()可以用,简直不要太方便。然后感触就是在写程序的时候不要想得非常具体,而是要基于这两种结构想他们的特点,这些特点能解决什么问题,解决问题的过程具体要怎么样,在脑子中构建出这整个过程。
- 队列其实可以看作是一种特别的线性表,一种对存储有特定要求的线性表。先进先出,就像平常的排队一样,先排队的先处理,后排队的后处理。主要运算算法包括入队Push(注意是否队满)、出栈Pop(注意是否队空)。在C++中,队列的实现被封装在类queue中,该类存在于头文件
中。 - 栈跟队列一样,也是一种特殊的线性表,其特殊的地方也是在存取这方面。队列的特性是先进先出,栈则是后进先出,像叠盘子一样。在C++中,有类stack类封装了对栈的实现。队列只允许在一端进行插入操作,而在另一端进行删除操作。
2.PTA实验作业(6分)
2.1题目一 6-2 在一个数组中实现两个堆栈 (20 分)
本题要求在一个数组中实现两个堆栈。
2.1.1代码截图
2.1.2本题PTA提交列表说明
本题一次性过关,主要是共享栈的设计,使其有两个栈底,一个为下标为0处,另一个为下标为maxsize-1处,进栈时一个下标从0开始加,另一个从maxsize-1开始减。
2.2题目二 6-12 jmu-ds-舞伴问题 (20 分)
假设在周末舞会上,男士和女士们分别进入舞厅,各自排成一队。跳舞开始,依次从男队和女队队头各出一人配成舞伴,若两队初始人数不同,则较长那一队未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。 你需要用队列操作实现上述算法。请完成下面5个函数的操作。
2.2.1代码截图
2.2.2本题PTA提交列表说明
- Q1:一开始出现编译错误
- A1:看了pta提交时的解释发现->不识别,写指针写习惯了,在用结构体的时候习惯写p->sex,用p.sex才是对的
- Q2:开始时出现格式错误,百思不得其解,看起来输出都是一模一样的
- A2:后来反复对比了很久,输出时姓名之间的空格是两个...不是一个...
2.3题目三 7-2 jmu-ds-符号配对 (15 分)
假设表达式中允许包含3种括号:圆括号、方括号和大括号。即(,[,'{'。编写一个算法判断表达式中的括号是否正确配对, 要求利用栈的结构实现。
2.3.1设计思路
定义字符型数组s 输入s
for循环i=0 to i<len
不是符号 跳过以下语句
为左符号 进栈
为右符号
栈空 退出程序(因为右符号没有左符号和它配对 表达式已经配对错误了)
为右符号且配对 出栈
结束for循环
接下来判断是否配对成功
栈空且i=len 配对成功
i不等于len 配对失败,输出no以及栈顶(栈为空不输出)
2.3.2代码截图
2.3.3本题PTA提交列表说明
- Q1:最初提交,两个测试点过不去,当括号不匹配且栈空时出现段错误
- A1:发现忘了最重要的在出栈时没判断栈是否为空,导致程序崩溃
- Q2:后来在判断是否配对成功的问题上遇到了困难,之前觉得只要栈空就是配对成功,后来发现不是这么回事
- A2:有时候如果只有右符号,栈一直是空的,但是很明显是配对错误的,所以引入一个len,当i<len时,即使栈中为空也是配对错误。
2.4题目四7-5 jmu-报数游戏 (15 分)
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(m<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。其中n是初始人数;m是游戏规定的退出位次(保证为小于n的正整数)。要求用队列结构完成。输出数字间以空格分隔,但结尾不能有多余空格。
2.4.1设计思路
定义m,N,数组line
定义队列qu;
m<N
数组line中的N个元素全部进队
队列qu不为空
报数m次,不为m的报数后重新入队,报数为m的直接出队 ,输出
m>=N 输出输入错误
2.4.2代码截图
2.4.3本题PTA提交列表说明
本题一次性过关,感觉这题挺简单的,主要就是队列的不断出队和重新入队,利用队列先进先出的特点解决问题。
3、栈和队列上机考试(-3--3分)
3.1错题一:7-1 jmu-ds-符号配对 (20 分)
3.1.1代码截图
3.1.2分析错误原因
先贴上上机考时的提交列表
这题是pta上已经做过的题了,上机考的时候考到这题,本来挺自信的,觉得应该挺快就能写出来,但是还是犯了很多小错误,忽略很多细节到导致这题因为测试点没有全部过去,调试了挺久的,然后考试时就没时间做其他的题了。首先还是出现了段错误,总是在出栈时忘记判断栈是否为空,我这脑子...怎么就记不住呢。然后就是配对时有很多情况没考虑充分,反反复复调来调去。结束后上机时的代码和之前在pta栈和队列上写的代码比较了下,发现上机考的时候写的会混乱比较多,虽然也是对的,但是有些情况之间写的比较重复,有重叠的部分,在考试的时候脑子比较混乱,想到的情况就叠加上去,只想着把测试点过去,代码思路会比较乱。
3.2错题二:6-3 jmu-ds-表达式求解 (20 分)
3.2.1代码截图
这题在上机考的时候没有写出来,所以没有代码。主要之前pta上中缀转后缀的题就没有怎么搞清楚,然后遇到这种类似的题就没啥自信能写出来,直接跳过去做其他的题了。现在贴上这道题的正确代码
3.2.2错误原因分析
因为没写出来,所以也没办法分析上机考时的错误,这里说一下这道题的设计思路吧。
遇见正数 直接入栈
遇见负号,判断是负数还是减号 是负数将负数入栈
遇见运算符号 出栈两次进行相应的运算 其中要注意除号分母为0的情况