1.本周学习总结#

“栈像一只袜子,队列就像通心粉”,这个比喻很形象。
栈和队列其实有类似之处,比如它们都只能在端点进行插入、删除,没有像数组那么方便取出数据,但它们有自己独特的优势,像符号配对、报数和银行问题,使用栈和队列是很好的选择。
它们的不同之处在于栈只有一个端点,出栈、入栈都是通过一个端口,而队列出队、入队则在不同端口,所以有些问题就更适合用队列来解决。由于它们结构上的差异,栈中元素都是先进后出,队列则先进先出。所以通过栈和队列的配合,可以实现队列的逆转。
栈和队列的容器可以大大简化我们的代码,使代码更简洁明了。判断字符串这题使用栈的容器的代码是自己写函数代码的1/2。虽然使用容器,出入栈(队)看似简单,其实不同的题目还是有难度的,符号配对、表达式转换就复杂许多,要考虑的情况较多,测试点也比较繁多。

2.PTA实验作业#

栈、队列函数题目分别选择1题
栈、队列编程题分别选择1题

2.1题目1:在一个数组中实现两个堆栈##

2.1.2代码截图###


2.1.3本题PTA提交列表说明。###

Q1:出现多种错误
A1:刚开始做的时候没有按书上的做法,同时将S->Top1和S->Top2同时置为-1
Q2:栈满,栈空的条件没有考虑清楚
A2:由于刚开始S->Top1和S->Top2都设置错了,栈满栈空就更不用说了,后来看了书才知道,栈空为S->Top1==-1,S->Top2==MaxSize,栈满为S->Top2-S->Top1==1

2.2题目2:jmu-ds-舞伴问题##

2.2.2代码截图###


2.2.3本题PTA提交列表说明。###

Q1:刚开始编译错误
A1:原因是pta上的编译器没选C++,还有刚开始的时候对结构体的使用有点忘记了,卡了一会
Q2:出现格式错误
A2:输出男女舞伴中间要2个空格,没注意只输出一个,后来发现这个输出样例的空格和上面好像不太一样,仔细看才发现是两个空格

2.3题目3:7-2 jmu-ds-符号配对##

2.3.1设计思路###

输入字符串
遍历字符串
如果是左括号就进栈
是右括号就判断是否栈空,是就输出no,结束程序。若栈不空,继续判断栈顶元素是不是和右括号匹配的左括号,不是则输出no,结束程序
出栈
循环结束
判断栈是否为空,空则输出yes,否则输出栈顶元素在输出no

2.3.2代码截图###



2.3.3本题PTA提交列表说明。###

Q1:出现部分正确
A1:一开始模仿7-1字符串是否对称的做法,把左右符号都一次性进栈,再遍历字符串,看看和栈顶元素是否匹配,然而这种做法遇到{}()这种例子时就崩了。后来就采用遍历字符串,发现左符号就进栈,遇到右符号就开始判断了,不再是等符号都入栈了才开始判断。
Q2:若不匹配,输出当前栈顶元素再换行输出no,若栈顶为空,则输出no
A2:做的时候没有考虑栈空问题,只对栈不空时做了处理,输出栈顶元素再输出no,所以在遇到右符号开始判断的时候,先判断栈是否为空,是就只输出no,结束程序

2.4题目4:7-6 银行业务队列简单模拟##

2.4.1设计思路###

建两个队列,q1代表A窗口,q2代表B窗口
先输入顾客总数,然后在循环中依次输入每个顾客编号,每输入一个就判断一个,若是奇数就进q1队列,偶数就进q2队列
在q1和q2队列非空的情况下,先把q1中队头前两个元素先输出再出队,然后把q2中队头元素输出、出队,完成一次循环
最后如果q1队列中有剩余元素,就都输出,q2也是同样的处理方法

2.4.2代码截图###


2.4.3本题PTA提交列表说明。###

Q1:思路问题
A1:一开始没有想到用两个队列来做,就停住了,后来采用两个队列,问题就简单了许多
Q2:部分正确
A2:没有考虑到只有A窗口顾客或只有B窗口顾客这种情况,所以空格的输出有点问题,所以在q1、q2队列中有剩余元素的情况中加了先判断flag变量的值,看是不是第一个元素

3、栈和队列上机考#

jmu-ds-舞伴问题##

错误代码截图###



进队列时应是Q->rear=(Q->rear+1)%MAXQSIZE,出队列时是Q->front=(Q->front+1)%MAXQSIZE,考试的时候把count和MAXQSIZE混淆了,用count代替了MAXQSIZE,所以编译器一直报错,但当时没有发现错误,就只好直接Q->rear++、Q->front++
输出配对舞伴时,直接输出DeQueue(Fdancers,p)结果,忘了是应先调用DeQueue函数,再输出函数里面的p.name
出错原因在于虽然知道题目思路,但没有注意一些细节的处理,虽然题目已经做过一遍,没有真正理解透就造成这个结果

7-1 符号配对##

错误代码截图###





输入字符串的时候,少了str[i++]=ch,以至于程序出错,连结果都无法输出。还有就是判断栈是否为空时多了!应该是if(s.empty()),若满足则输出"?-}"这种符号,因为多了'!'答案也都是错误的。做pta时后两个测试点没过,所以代码还是存在一些问题
字符串输入少了str[i++]=ch,这个就是很低级的错误了,短时间内完成代码还是有一定难度的,关键还是自己代码量不够吧