1.本周学习总结
-
通过这周的学习,我学到了有关栈和队列的知识,栈也称为堆栈,是一种线性表。它的特性就是先进后出,删除与加入均在栈顶操作,最先放入堆栈中的内容最后被拿出来,最后放入堆栈中的内容最先被拿出来, 被称为先进后出、后进先出。栈中有两个最重要的操作是PUSH和POP,这两个操作是相反的。PUSH就是入栈,在堆栈的顶部加入一 个元素。POP就是出栈,在堆栈顶部移去一个元素, 并将堆栈的大小减一。
-
队列也是一种特殊的线性表。不同于栈所服从的先进后出的原则,队列的原则是先进先出。队列在队头做删除操作,在队尾做插入操作。就好比是一条宽度只容得下一个人的巷子,人一个个进入,最早进的也是最早出的。
-
我觉得这两种数据结构的最大好处就是他们操作起来的时间复杂度都是比较低的,大部分是O(1),虽然现在看起来O(1)和O(n)没有什么差别,但是在以后会逐渐的体现出来他们的差别,因为我们现在打的代码数据都太小,所以感觉没什么差别,但是到了以后要进行大数据的处理的时候,就会发现时间复杂度低的重要性了,所以两种数据结构是很有用的。
-
一开始学栈和队列,看了书之后感觉还是可以理解的,不过后来才觉得自己太天真了,书上的代码只是那些最简单的操作,比如栈和队列的初始化,还有进栈入栈等比较基本的操作,看着还是能理解的,但是到了真正打代码的时候,才觉得难,打pta的时候几乎都是要书本放在面前才能打,后来才渐渐习惯了,不用书本也能打了,所以这也体现了代码量的重要性。个人觉得比较难的就是栈和队列的应用了,比如那个迷宫问题,非常难,看了很久也才懂一点点,最后还是问了同学才将其勉强搞懂。
-
感觉最有用的就是栈和队列的容器的使用了,就是开始的时候头文件的定义,要定义queue和stack,这样在打代码的时候节省了很多的时间和代码量,而且也好理解。容器比较经常用的就是在编程题,一开始还不知道,傻傻的写了进栈入栈等函数,结果还错了,后来有同学说使用容器会比较简单,一句话就可以解决进栈入栈等操作了。
2.PTA实验作业
2.1.题目1:6-2 在一个数组中实现两个堆栈
2.1.1设计思路
- 函数体不要写设计思路。编程题用文字描述设计思路。(可不写伪代码)
2.1.2代码截图
2.1.3本题PTA提交列表说明
- Q1:一开始没认真审题,它函数那边已经声明false和true是用在入栈的操作中,而我却在出栈中也使用了。导致一直编程错误。
- A1:后来我再仔细看了一下,原来他出栈如果出错是要使用ERROR的,如果出栈成功是要返回出栈的那个值,改了之后就对了。
- Q2:还有就是在栈的初始化那里,对于Data的空间分配出错了,我以为只要和以前的一样就可以了,就是只定义sizeof(int)就行了,所以一直出错。
- A2:后来上网查了一下,原来定义的时候还要乘以Maxsize,就是定义MaxSize * sizeof(int),这样才有足够的空间。改了之后就正确了。
- A3:从这一题我觉得最重要的就是审题了,不仅要好好看原本函数的内容,还要注意看输出格式,不然很容易出错,而且这种错误是很不应该的,要尽量避免。
2.2.题目2:6-12 jmu-ds-舞伴问题
2.2.1设计思路
- 函数体不要写设计思路。编程题用文字描述设计思路。(可不写伪代码)
2.2.2代码截图
2.2.3本题PTA提交列表说明
- Q1:一开始我返回长度的那个函数其实不是那样写的,写得比较麻烦,所以中间有一点错误,但是其实有种方法不用那么麻烦的,而且还不会错。
- A1:那就是在函数中直接返回尾指针减去头指针,那样就是该队列的长度了。
- Q2:在进行名字存储到队列中时,我就是把字符一个个存入,就是运用上学期的知识,把字符串一个个存入数组中,但是一直出错,调试也觉得没问题。
- A2:后来请大佬来看看哪里出错了,人家一眼就开出来是结尾的时候没有 ,就是字符串最后那个,改了之后就对了。
- A3:这题一开始的原函数看了很久,差点忘了以前定义结构体是可以嵌套的,还好借助了这题可以复习一下。
2.3.题目3:7-5 jmu-报数游戏
2.3.1设计思路
首先输入n和m,再进行判断n和m的关系,如果n<m则输出error,然后结束程序。
如果n>m,则定义i用来控制循环,把1到i的数都存入队列中。
接着就开始循环,当队列长度满足大于等于报的那个数值时循环,在循环中接着循环,把报数前的数在队列中出队,然后在继续入队。当遇到报的那个数值的时候,就对那个数值出队,然后不再继续入队,而是输出。
循环到最后,当队列的长度小于报的那个数值时结束循环,然后输出队列中剩下的数值。以此完成报数的输出。
2.3.2代码截图
2.3.3本题PTA提交列表说明
- Q1:在写这题的时候一开始我不是这样的写法,我是还定义了一个数组用来存放要输出的内容,在某人报到那个数的时候存入数组,直到队列长度小于要报的那个数时结束。
- A1:后来仔细想想,这样的写法虽然挺简单易懂的,但是好像不符合这次作业的要求,题目是要求队列完成的,所以后来我换了一种写法。
- Q2:出现部分正确是因为有个测试点是n<m时的情况,我这个点有得分,但是后面的不知道哪错了,明明思路很清晰。
- A2:再仔细看看题目发现原来当n=m是还是要继续循环的,我一开始是当n>m是进行循环,后来改成n>=m时循环,就对了。
- A3:还有就是在输出格式上我也是有注意的,但是那个控制格式的变量temp在最后的时候忘了加加了,所以出现了错误,下次尽量不犯这种低级的错误。
2.4.题目4:7-2 jmu-ds-符号配对
2.4.1设计思路
对数组进行遍历,如果字符是( 或 [ 或 { 时就入栈。
当字符是 )时,如果栈是空的,直接输出no然后结束函数。如果不是空的,令op等于栈顶元素,且出栈,如果op是 )的话就继续循环,否则flag等于1。
对 } 和 ] 的判断方法也是一样的。
到了循环结束的时候,如果栈是空的且flag等于0,则输出yes,否则输出no。
2.4.2代码截图
2.4.3本题PTA提交列表说明
- Q1:代码打完的时候,运行一下,发现是答案错误,然后看了很久,发现是栈里面的内容是不变的。
- A1:在令op等于栈顶的元素之后,忘了出栈,所以栈里的元素一直不变无法进行比较。使得答案错误。
- Q2:在纠正上面的问题之后,输出的结果和pta上的一样,然后进行提交,又发现了新的错误。
- A2:这次我是真的看不出来了,思路清晰,而且结果也一样,看了很久很没看出来,实在没办法了就请已经写出来的同学来看看哪出错了,人家不亏是写出来的,一看就知道我哪错了,原来是当字符为右符号时,要对栈进行判断,判断是否为空。
3、栈和队列上机考试
3.1.错误题目1:6-1 在一个数组中实现两个堆栈
3.1.1错误代码截图
3.1.2错误原因及体会
原因:初始化函数返回没有返回栈,而是返回0。还有就是输出的时候多了个感叹号。
体会:讲真的这题会做错我是真的不相信,可事实就是如此,这题我思路是很清楚的,但提交就是不对,代码我也反复看了很多遍,可就是找不出哪错了,所以最后这题是零分,很难受,回到宿舍,我再打开一看,真的是很后悔,为什么自己那么粗心,明明最主要的都对了,就差点标点符号还有返回值就使我没有分数。通过这次考试使我明白仔细审题的重要性。
3.2.错误题目2:7-3 列车调度
3.1.1错误代码截图
3.1.2错误原因及体会
原因:没有真正明白题目的意思,我一开始以为它的意思是需要多少辆列车可以使他们按编号递减的顺序出去,就是当遇到一个数比前一个数大的时候就要多一辆列车。但其实题目的意思是需要多少列车才可以使输入的数按顺序输出。
体会:这题会做错并没有太大的意外,因为它放在最后肯定是有它一定的难度的,因为那时候时间并不多了,所以看题目的时候非常快,所以漏掉了许多重要的信息,我在打这题的时候就觉得奇怪,最后一题不会那么简单吧,当运行代码的时候看到结果和测试数据是一样的,我还开心了一下,有点小激动,但放到pta上却是错误的,也没时间改了,考试就结束了。从这题我觉得不管时间还有多少,看题目还是要仔细的,不能太快,不然如果漏掉了什么信息,就算打出了代码却还是错的,这会更着急,所以要稳住。