DS博客作业03--栈和队列
1.本周学习总结
本周学习了栈和队列的知识,感觉上比前面的链表知识容易理解也更易操作,栈只能在栈顶进行插入和删除操作,即先进后出,而队是只能在队头进行删除操作,在队尾进行插入操作,即先进先出,理解了这两句话基本上也就理解和对栈和队列的操作方式,但在pta里面也还是出现了很多问题,最大的感觉就是栈和队列的题目可以用比较短的时间写出代码,但写出来的程序也会存在很多错误,有些是直接在运行结果里可以看出来的错误,还有一些提交了无法通过测试点的错误,就像符号配对的那题,我最开始写完代码花的时间也不长,运行以后输入样例也看出来有错,但提交以后却只过了一个测试点,后来又测试了很多数据以及调试了程序很多次,花了很多时间才找出来里面存在的错误以及更改,所以在栈和队列的代码的话在写的时候就要非常注意,很多细节地方都会导致后面的错误,类似像一旦栈空了以后,就不能在对栈进行取栈顶元素的操作,这样的错误编译器不会报错,但运行时结果为空,只有一步步调试才会发现在那个地方异常终止,如果在考试中等写完程序才发现这样的错误的话,真的会浪费很多时间才能找到错误。
2.PTA实验作业(6分)
2.1.题目1: 在一个数组中实现两个堆栈
2.1.1代码截图
2.1.2本题PTA提交列表说明
Q1:理解错题目,在创建堆栈的时候就写错了,两个top指针都指向了一个位置
A1:将Top1和Top2分别指向栈底和栈顶,创建堆栈才正确。
Q2:判断两个堆栈是否为空是出现问题,导致输出超限
A2:在最后一个出栈函数里,最开始我为了省几行代码就直接把判断两个堆栈是否为空的条件写在一个if后面
出现了输出超限的问题,但前面的代码检查了很多遍都没有发现问题,后来才在判断是否为空这里发现如果其中一个堆栈已经为空但另一个堆栈没有时,就会直接返回ERROR,所以后面将两个堆栈为空的条件分开放在判断完编号以后if下面
终于才是通过了所有测试点。
2.2 题目2:舞伴问题
2.2.1代码截图
2.2.2本题PTA提交列表说明
Q1:函数总是会习惯性把所有代码粘贴上去,直接编译错误,太不注意了,导致在考试中也出现了这样的错误。
Q2:输出后男士和女士竟然是隔着两个空格,当时因为这个错误还重新看了前面所有的代码,但改哪里运行出来的结果都是对的,后来才发现原来是少输出了一个空格,幸好是练习,要是考试直接出来这样的题目,一个陷阱就可能会浪费很多时间才能找出来,以后还是要多注意输出样例里的格式细节。
2.3 题目3:符号配对
假设表达式中允许包含3种括号:圆括号、方括号和大括号。即(,[,'{'。编写一个算法判断表达式中的括号是否正确配对。
2.3.1设计思路
将表达式中每一个字符顺序存入数组,同时对数组进行遍历,遇到左括号就入栈,遇到右括号时如果栈空,则直接返回false,如果配对,将左括号出栈,遍历完成后,若栈为空则返回true,否则输出栈顶元素和no,返回false。
2.3.2代码截图
2.3.3本题PTA提交列表说明
Q1:测试点括号配对时过不去
A1: 这题提交了很多次,都是括号配对这个点过不去,但是运行时输入样例也都正确,后来才发现是如果右括号在左括号前面时例如)))(((程序也能输出配对,问题是我的程序是先将表达式中所有左括号都入栈,然后才遍历数组配对栈中的右括号,所以即使右括号在左括号前面,程序也认为是括号配对成功,改成在遍历数组左括号入栈的同时将栈顶元素与数组的元素配对,问题才解决。
Q2:运行后输入样例什么都不输出
A2:这个点犯了一个很严重的错误,就是在判断栈顶的右括号与数组中的左括号是否配对时,因为有三种括号,所以我写了三个if语句来分别判断([{与)]}的配对,
运行结果就是错误的,一步步调试以后发现如果进行了出栈操作后栈空了,那接下来就无法对栈进行任何操作,取栈顶元素也不可以,程序调试时到这里就会异常终止,加了是否栈空的判断后,
程序运行结果就正确了。
2.4 题目4:报数游戏
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(m<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。其中n是初始人数;m是游戏规定的退出位次(保证为小于n的正整数)。
2.4.1设计思路
先将队伍的编号入队,在队列不为空的前提下,将队头的元素插入到队尾,然后将队头元素出队,循环m-1次,然后输出每一次循环后的队头元素,这个队头元素就是每一次报数中数到m的人,将其出队,继续下一次报数循环,知道队列为空。
2.4.2代码截图
2.4.3本题PTA提交列表说明
Q1:输出的是报数为m+1的结果,答案错误。
A1:进行报数操作的for循环次数多了一次,最开始写的代码是进行m次循环,但到第m次循环时报数为m的元素又被插入到了队尾后出队,减少一次循环次数以后输出结果就正常了。
Q2:没有进行游戏规定的退出位次保证小于队列长度的判断。
A2:加入了if(m<n)的判断,不符合时直接输出error,答案就正确了。
3、栈和队列上机考试
3.1 错题1:另类堆栈
在栈的顺序存储实现中,另有一种方法是将Top定义为栈顶的上一个位置。请编写程序实现这种定义下堆栈的入栈、出栈操作。
3.1.1 错题代码截图
3.1.2 错误原因及体会
这题当时写的时候还是很顺畅的,没有花很多时间,所以当时复习代码的时候也没有多看,但这题有两个函数是题目不要求写的,但是也没有给出来,考试的时候要求的函数很快就写完了,但我忘了那两个函数怎么写,导致程序编译不了,直接提交又出现了编译错误,只能自己一行行找代码有什么错,浪费了很多时间找那些没有换行还有缺分号这种低级错误上,这题的代码并没有困难,但想要提醒自己下次有这种题目没有给出来的函数在写的时候还是要好好写,两次考试我都出现了这个问题。
3.2 错题2:报数游戏
3.1.1 错题代码截图
3.1.2 错误原因及体会
这题在上面也有些,但考试时我的做法跟做pta时不太一样,原因是在pta上我用的时queue函数来操作队列,但当时写的时候为了快点就把前面函数题给的代码直接拿过来用了,考试时我把main函数写完,在定义的时候我就不是很清晰,一直没办法使用queue函数,只能用最基本的定义头尾指针来操作队列,这种做法的代码量更多,再加上时间也不够,到最后我也只拿了一半的分,很可惜,但也给了自己一个教训,就是平时在做编程题的时候不管main函数还是前面的函数定义都要自己来写,不清楚可以看老师给的代码,但不能直接粘贴复制过来,自己只写main函数,这样考试的时候编程题上会出现很多问题。