• DS博客园作业--03栈和队列


    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中的题目必须熟练。目前来看,我还没有很好的解决方法,只有一个方向。
  • 相关阅读:
    HDU 3401 Trade 【DP+单调队列优化】
    POJ 3017 Cut the Sequence 【DP+单调队列优化+平衡树】
    CodeForces 342D Xenia and Dominoes 【DP+容斥】
    HDU 4348 To the moon 【主席树+区间修改】
    [ 转载 ]hashCode方法的相关用法
    [ 转载 ]hashCode及HashMap中的hash()函数
    [ 原创 ] Map之HashMap的使用方法
    [ 转载 ] vue.js面试题一
    [ 转载 ] Java基础二
    [ 转载 ] Java基础
  • 原文地址:https://www.cnblogs.com/1112wlt/p/10743789.html
Copyright © 2020-2023  润新知