1.本周学习总结
谈谈你对栈和队列结构的认识及学习体会。
栈和队列的本质就是线性表。所以,相应的栈跟队列都有两种存储结构:顺序存储结构、链式存储结构。
栈的特点是后进先出,根据栈时进时出的规则,出栈的顺序可以跟入栈顺序不不同,而队列的特点则是先进先出,入队的顺序是怎样的那么出队的顺序就是怎样的。与线性表相同,栈和队列的顺序存储结都会有空和满两种情况,而链式存储结构相应的也是一般不用考虑满的情况。在学习迷宫问题时,栈和队列同样可以解决迷宫问题,不过栈是深度搜索,找到的迷宫路径不一定的最短路径,而队列则是广度搜索,找到的路径一定是最短路径。
在学完一个个进栈、出栈、入队、出队……的函数之后,我们又学了C++中的两个类:stack、queue,原本自己手打函数,一大段一大段的代码,只要一行就可以解决了。不过因为这两个类都是链式存储,出栈、出队完,那些出栈、出队的数据就没了,所以这两个类并不是所有时候都适用的,所以该自己手打代码的时候还是得自己打。
2.PTA实验作业
本周要求挑4道题目写设计思路、调试过程。题目选做要求:
- 栈、队列函数题目分别选择1题
- 栈、队列编程题分别选择1题
2.1 题目1:在一个数组中实现两个堆栈
本题要求在一个数组中实现两个堆栈。
函数接口定义:
- Stack CreateStack( int MaxSize );
- bool Push( Stack S, ElementType X, int Tag );
- ElementType Pop( Stack S, int Tag );
2.1.2 代码截图
2.1.3 本题PTA提交列表说明
- Q1:做这道题的时候,老师在课上已经讲过了,所以提交列表里就两行,那为什么还会出现编译错误呢?
- A1:那时候我还以为是一遍过的,结果一提交,编译错误,看了眼PTA的报错,好吧,老毛病又犯了,总把MaxSize当作是全局的常数,然后用到它的时候,直接就把MaxDize赋值给谁谁谁,忘记了结构体调用。
2.2 题目2:jmu-ds-舞伴问题
假设在周末舞会上,男士和女士们分别进入舞厅,各自排成一队。跳舞开始,依次从男队和女队队头各出一人配成舞伴,若两队初始人数不同,则较长那一队未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。 你需要用队列操作实现上述算法。请完成下面5个函数的操作。
函数接口定义:
- int QueueLen(SqQueue Q);//队列长度
- int EnQueue(SqQueue &Q, Person e);//加入队列
- int QueueEmpty(SqQueue &Q);//队列是否为空
- int DeQueue(SqQueue &Q, Person &e);//出队列
- void DancePartner(Person dancer[], int num); //配对舞伴
Q:队列
e:参加舞会的人
dancer:全部舞者
num:参加舞会的人数
2.2.2 代码截图
2.2.3 本题PTA提交列表说明
这道题看提交列表没用,我是在vs上调试完,能运行正确了才复制提交的
- Q1:一开始的时候,不太会写,发现要写的函数没有用在给出的main()函数中
- A1:然后想着先把那些基础的函数写完,写的时候还纠结了一下队空、队满的情况要不要分类讨论,写完了之后,才发现这些函数好像是用在DancePartner()函数中
- Q2:然后就开始纠结,为什么没把队列传参,就自己设了两个队列在DancePartner()函数中
- A2:把所有的都写完了之后,运行了一下,结果运行时出错了,于是就又看了一遍题目给出的那段代码,发现题目中已经设了两个队列,然后因为传参没有传队列进去,我就不知道该怎么写,然后想想,算了,直接在DancePartner()函数中用吧,把我自己设的那两个队列换成题目中的那两个之后,他能运行了,而且还是正确代,提交了一些就过了。
2.3 题目3:jmu-字符串是否对称
编写一个算法利用顺序栈判断一个字符串是否是对称串。所谓对称串是指从左向右读和从右向左读的序列相同。
2.3.1 设计思路
定义两个链栈:s1、s2,s1用来储存字符串,利用栈的后进先出的特点,将s1中一半的字符从栈顶出栈,传入s2中(如果字符串为奇数,多出栈一次,不传入s2中)。把两个栈的栈顶进行比较,相同,两个栈同时出栈,继续比较当前栈顶,以此类推;若不相同,则说明该字符串不是对称串。
2.3.2 代码截图
2.3.3 本题PTA提交列表说明
这题其实挺简单的,当时舍友问我这道题怎么做的时候,我还没写,看了眼题目,然后瞬间就想到了这种做法,提交后一遍过的事实证明,这个做法是可行的。把这题写入博客园也不是因为这题有多难多难,只是想记住一种思路(因为我经常做题时可能有很多觉得不错的想法、思路,但是随着题目的完成,这些当时挺不错的思路也跟着消失了,写到博客园中,以后再看的时候,可能就会有,欸,还有这种做法的感觉)
2.4 题目4:银行业务队列简单模拟
设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。
2.4.1 设计思路
定义两个队列,q1、q2,根据队列先进先出的特点,在输入的过程中,将奇数的存放在q1中,偶数的存放在q2中,由于A窗口优先输出,则在输出时当q1不为空的情况下,先输出一个奇数,再判断q1是否为空,输出一个奇数,在q2不为空的情况下再输出一个偶数。
2.4.2 代码截图
2.4.3 本题PTA提交列表说明
- Q1:当时看到题目,欸,超简单,不就输出两个奇数,在输出一个偶数嘛,然后……就错了(在vs上运行的时候)
- A1:后面仔细想了想,不对,万一A窗口的人数不是偶数呢,于是在第二次出队前又加上了一个判断语句
- 所以说,不要因为一个题目看着简单,就不怎么思考,还是要好好考虑题目中是不是有什么坑
3.栈和队列上机考试
错题及解决办法
截图错题代码,分析错误原因及后续要改进地方。请至少列举2题。如果拿满分同学,这部分可不写,直接拿3分。
注意:分析错误原因及体会,主要讲代码错误。
错题一
- 错误分析
当时上机考试的时候,看到这道题,想都没怎么想,直接选B,因为之前做过的题目,都是说长度为m的队列,出队时的操作,那不就是front =( front +1)%m了嘛,然后考完了之后一看,emmmmm,我这题怎么错了,再一看,好吧人家是数组A[0..m],总共m+1个数……所以答案选D:front =( front +1)%(m+1) - 体会
所以说,不要觉得题目看着眼熟,然后就想当然,之前就真么做的,那这题也就这样的,还是要认真的审题!审题!审题!
错题二
- 错题分析
上机考试的时候,一看到这道题,心里瞬间一慌,然后……脑袋一片空白,不知道这种题该怎么做,记得当时我是把运算符也给入栈了,也不知道怎么算的,反正就算了个5。后来,考试完了,脑袋清醒了,再看这道题……怎么这么简单,我当时在想什么,为什么要把运算符也给入栈了(当事人就是非常的后悔.jpg) - 体会
上机考试的时候,出现大脑空白的情况,也只能说明我对这一部分掌握的并不如我想象中的牢固,很多知识点我基本都是一遍过,当时懂了,如果题目没出现,基本不会再去过问的那一种,这种习惯是真的不好,(虽然到现在都还没改过来)不过借着写博客园再把这题过一遍,加深一些印象
小结
这次上机考试呢,发现自己时间完全不够用,只做了选择题,和函数题,编程题一道都没写(连提交记录都没有的那种),所以错题只写了两道选择题(我写了的题目中就错了这两道)
时间不够用呢,主要是有一下两点:一、做过的题目不熟练,还是会有各种小错误;二、上机考试前,PTA里的题没打完,对题目没印象,直接现场打代码+调试,再加上那个不太熟练,以至于时间花费过多。这就导致了后面的题目做不完的情况。PTA没去打我认错,最近各种练习赛比较多,题目又难,往往打完比赛之后就不会想再去碰代码,看到PTA就不想动,以至于PTA作业一拖再拖。不过既然这种消极的心态影响到了我,那我就应该调整好自己的状态,毕竟学习更重要。