1.本周学习总结(0--1分)
1.近两周主要学习了栈的初始化,插入,删除,取栈顶元素,判断栈是否为空,讲解了后缀表达式的生成原理及代码,学习了队列的初始化,进队列,出队列,判断队列是否为空,还讲解了循环队列,循环队列用于放止假性的队满情况。同时讲解用队列处理迷宫问题,队列处理迷宫问题时不能用queue函数,不能使用循环队列。
2.栈和队列实用性很强,栈主要是后进先出,队列是先进先出。相对于线性表的知识,我觉得栈和队列是线性表的变式,有有序表和链表,就有有序栈和链栈,有序队列和链队列。相关的操作也很相似,我经常把栈和队列的插入删除操作和线性表进行比较。
3.代码方面,栈和队列的题目难度明显提升,测试点更加丰富,对提高一个人的编程能力有很大帮助。
2.PTA实验作业(6分)
2.1题目1:6-2 在一个数组中实现两个堆栈
2.1.2代码截图
2.1.3本题PTA提交列表说明。
- Q1:没理解题目。
- A1:本题目作者在叙述题目的时候不够详细,两个函数细节不表,在理解上有很大困难, 最后一个pop是出栈的意思,在主函数中并没有,最后想到print函数中可能有
- Q2:出现段错误,不清楚原因。
- A2:这道题是用C语言编写的,我习惯于用C++中的new对C语言中的动态分配却不是特别了解,一开始出现段错误的时候是在考试的时候,当时以为是C语言的语法使用错误,加上上机考试中的编译器版本比较老,我无法判断q是否分配了空间,所以在考试中没做出这道题。实际上我的动态分配的语法并没有出现错误,真正的错误是 在出栈的时候当成了入栈操作,打错了。
- Q3:修改完上述问题,还是出现了错误 。因为题目中给的条件不完整,我无法调试程序,不知道错误出在哪里。
- A3:通过与正确代码比较,我有一个小错误,就是把 S->Top2-1打成了S->Top1-1。
反思:本道题看起来难,考的却是很基础的东西,为什么我会在上机考试时出现错误。在上机考试的前一天晚上我还特地重打了一遍代码。总结起来:1.没有真正理解题目意思,很多时候打代码凭感觉。2.不够自信,C语言中的动态分配用得少就认为自己一定会出错,实际上错误另有其人。3.在检查代码方面需要加强,本题中因为不能调试在检查时增加了不少困难。
2.2题目2:7-3 符号配对
2.2..1设计思路
本道题有三个难点:1.如何区分中间的点和结尾的点。 2.理解题目意思。3.转换/*和*/
1.先假设一个string s用于存放一个又一个的字符串,如果字符串中只有一个‘.’则结束,如果'.'出现在中间则继续输入数据。接着用一个数组a把{[()]}通通存储起来,当遇到‘/’判断数据串下一个数据是否是‘*’如果是,在数组a中存入‘<’,如果遇到‘*’如果下一个数据是‘/’那么在数组中存入‘>’。
2.进入一个新的循环中把数组a中的数据导出,a[i]表示当前字符,同时{[(<存入栈中用于配对。如果在循环过程中遇到}])>先判断栈是否为空,如果栈为空输出NO换行再输出?-左字符,结束程序,这里要注意当符号为>时输出的左字符为*/ 当栈不为空的时候先判断符号是否配对,如果配对则删除栈顶元素,继续循环,否则,输出NO换行 和栈中元素-?如果栈中元素为<则输出/*-?,结束程序。
3.最后循环结束的时候进行判断,如果栈中没有元素,则输出YES否则输出NO换行 和栈中元素-?如果栈中元素为<则输出/*-?,结束程序。
2.2.2代码截图
2.2.3本题PTA提交列表说明。
- Q1:没有理解题目,输出第一个不配对的字符是意思不明确。
- A1:这道浙大的题目比起之前的7-2难度提升不小,题目的样例少,我在做这题的时候理解出现了偏差,在设计算法方面也是毫无头绪,到底什么才是第一个不配对的字符,我一开始以为是从左往右数第一个,一直想不明白怎么判断。之后没办法只能去百度,才知道是从中间往两边数,第一个不配对的字符。在看代码的过程中我也学会了用<>表示/和/
- Q2:提交中仍然出现多种错误。
- A2:我检查了代码,这里涉及到一个字符转换问题,没有在输出的时候把‘<’和‘>’转换为‘/’和'/',同时在数据方面判断不足,如果输入数据中出现'.'则提前结束,为此参考代码,用字符串来解决过程和结尾的‘.’的判断问题。
- Q3:提交了好几次的代码,一直通不过最后一个测试点,也不理解最后一个测试点的含义。
- A3:我不断调试,希望能发现输出方面的错误,试了几次依然没有发现错误,最后无奈检查代码,发现最后一步在输出方面有一点小错误,一个小错误耗费了半小时。
反思:浙大的题目在理解上有很大困难,同时题目中所给的测试点不够多,很多时候错了都不知道自己哪里错,这道题目参考代码
和
即使在参考代码的情况下设计算法,调试,解决问题还是花了我三个小时的时间,我在这方面的运用相当不熟练。打完代码之后,发现其实这题并不难,但是细节比较多,容易出错。
2.3.题目3:6-11 另类循环队列
2.3.2代码截图
2.3.3本题PTA提交列表说明。
- Q1:出现很多错误
- A1:1.本函数题不能调试,没有经过调试就直接提交。2.输出数据没有换行 3.出栈是应该是count--结果打成了count++ 4.count的最大值为MaxSize我把判断条件设置成了MaxSize-1。
反思:不能调试的题目就特别容易出错,同时在设计算法时思路不清晰,经常出现小错误。
2.4题目:7-5 jmu-报数游戏
2.4.1设计思路
本题为报数游戏,每报数一个人则队列中少掉一个人,同时又是循环报数,所以应该使用循环队列,本题中,我用了一个count来统计队列中的人数,便于在有一个人报数的时候循环的范围缩小。用chose表示该出队列的号数,就这样,一圈一圈地循环,循环的圈慢慢缩小,最后当count小于chose的时候,输出剩余数据。
2.4.2代码截图
2.4.3本题PTA提交列表说明。
- Q1:队列的大小不断变化
- A1:通过定义一个count来统计成员个数,之后再在count的框架下设置循环队列。
- Q2:输出时出现错误。
- A2:当数据不合法时,输出的error没有加上感叹号。
反思:虽然这道题在提交列表上没有出现很多错误,但是我在背后却思考了很久,在调试的过程中也不断思考怎么在count的新的框架下设置循环队列。总之,这是一道循环队列的基础题,对设计循环队列提供了一个模板。
3、栈和队列上机考试
3.1题目:6-1 在一个数组中实现两个堆栈
3.1.1代码截图
3.1.2说明及改进地方
说明
- 1.本道题是一道基础题,我却出现了段错误,主要原因是对C语言的代码还不熟练,平时主要用new来初始化。同时考试时采用的编译器是就版本的编译器->和.均没有提示,让我无法判断是否成功申请了动态存储空间。
- 2.考试时比较紧张,同时这道题的代码 不能调试,我一开始一直修改malloc旁边的变量,希望能出现正确的结果,事实上错误是在后面的出栈操作。
- 3.本道题的后续改进参考2.1中的代码。后面把代码重新打了一遍,其实这道题是一道简单题。
- 4.没有检查代码,这是很大的失误,当时非常不自信,认为这道题肯定会错,也是失误的原因。
- 5.本道题打了40分钟,害怕时间浪费,没有接着检查。
改进:
- 1.多使用C语言的动态分布。
- 2.考试的时候尽量不要慌乱,不要轻易认为自己不行,要不断总结。
- 3.出栈操作不熟练,打代码时要明白自己的目的,带着清晰的大脑。
3.2 题目:7-1 符号配对
3.2.1说明及改进
说明
- 1.这道题我没有在考试时打代码,原因是我没有在pta中完成相应的题目,见到后直接放弃。
改进 - 1.多加练习pta题目,这道题在pta中属于难题,之前我在pta中因为时间不够,没有打这道题的代码。
反思
- 1.之前上机考试我一直有一种感觉,感觉上机考试的电脑用得很不习惯,这次明白了,上机考试时编译器版本较老,很多语法都没有提示。同时上机考试时,在代码调试的时候输入Ctrl+V不能输出我复制的数据,这导致在调试的时候必须一个又一个地输入数据,增加了不必要的时间消耗。本次pta中我只做出两道题,做错一道题,大部分题目处于放空或者乱蒙状态,害怕新题和复杂题是我考试时的心态。总结起来是编程能力不够,知识运用不熟练,题目意思没理解。
- 2.为什么一到上机考试就不行了,比较两次上机考试,我得出结论(1)平时打代码一个小时打出一道中等难度的编程题,半个小时打出一道简单的编程题或者函数题。一到上机考试有时间限制加上紧张,就不会了,(2)平时打代码都是边打代码边看书,上机考试时不能看书,就算出现了一些小错误,也无法验证。(3)上机考试的题目除了一些平时的题目,还有一些新题,这些题目在理解上有困难,即使是出了考场也要花一个小时以上的时间才能解决,在考场上紧张的氛围中,在编程水平不够的条件下,很难解题。
- 3.解决方向:虽然考场上有一些新题有一些难题,但是如果把pta中做过的题目全部做对,还是可以及格。如果编程水平高,还有机会去多解决几道新题,但是如果编程水平低,考场上的时间就显得不够。pta中的题目必须熟练。目前来看,我还没有很好的解决方法,只有一个方向。