1.本周学习总结
- 这周是栈和队列的学习,两者的原理简单并且c++STL对queue和stack类进行了包装,使用起来非常方便。所以一般使用问题不大,不过用于解决更深层次的问题,还需要更好的理解栈和队列。
- 栈相当于一个单口容器,后放的在上面,当取出时就要先取出上面的,所以是后进先出。队列则像是一头进一头出的队伍,先排到队列的先出来。栈可以用于实现深度优先搜索,队列则可以用于实现广度优先搜索。同时,两者还可以结合巧妙解决逆转,表达式转换或者求值等问题。
2.PTA实验作业
2.1.题目1:6-2 在一个数组中实现两个堆栈
2.1.1设计思路
在CreateStack函数中为结构体和数组分配好内存,push函数先判断堆栈是否满,然后根据Tag对相应堆栈进行输入
pop函数先根据Tag判断对那个堆栈操作,然后再进行判断是否为空,不空就出栈。
2.1.2代码截图
2.1.3本题PTA提交列表说明
Q1:输出搞错了,满是没有输出Tag没有输出
Q2:没赋值直接用Mystack->MaxSize
2.2.题目2:6-12 jmu-ds-舞伴问题
假设在周末舞会上,男士和女士们分别进入舞厅,各自排成一队。跳舞开始,依次从男队和女队队头各出一人配成舞伴,若两队初始人数不同,则较长那一队未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。 你需要用队列操作实现上述算法。请完成下面5个函数的操作。
2.2.1设计思路
男女全部分别入队,然后先男出队,后女出队,直到至少一队为空。
2.2.2代码截图
2.2.3本题PTA提交列表说明
Q1:函数都比较简单但是多需要细心处理,所以有小错误
2.3.题目1:7-3 符号配对
请编写程序检查C语言源程序中下列符号是否配对:/与/、(与)、[与]、{与}。
2.3.1设计思路
左括号入栈,右括号就取栈顶配对,根据配对结果输出。如果最后栈空即为配对成功。
2.3.2代码截图
2.3.3提交列表
Q1:一个输出写错一直没发现。
Q2:对/和*判断处理不够细心,循环要移动两次
2.4.题目1:7-7(选做) 银行排队问题之单窗口“夹塞”版
排队“夹塞”是引起大家强烈不满的行为,但是这种现象时常存在。在银行的单窗口排队问题中,假设银行只有1个窗口提供服务,所有顾客按到达时间排成一条长龙。当窗口空闲时,下一位顾客即去该窗口处理事务。此时如果已知第i位顾客与排在后面的第j位顾客是好朋友,并且愿意替朋友办理事务的话,那么第i位顾客的事务处理时间就是自己的事务加朋友的事务所耗时间的总和。在这种情况下,顾客的等待时间就可能被影响。假设所有人到达银行时,若没有空窗口,都会请求排在最前面的朋友帮忙(包括正在窗口接受服务的朋友);当有不止一位朋友请求某位顾客帮忙时,该顾客会根据自己朋友请求的顺序来依次处理事务。试编写程序模拟这种现象,并计算顾客的平均等待时间。
2.4.1设计思路
建一个结构体,包括名字,到达时间,办理时间,朋友圈,然后输入数据建立链表,然后链表第一个数据入队列,再遍历剩下链表节点,如果发现某节点名字在第一个数据的朋友圈中并且在朋友办理事务之前到达就入队,把入队的节点全部删除,重复操作,直到链表为空,就意味着处理完毕。
2.4.2代码截图
2.4.3提交链表
Q1:没有考虑好空闲时间和第一个客户不是0分到达的情况
3、栈和队列上机考试
题目一:6-3 jmu-ds-表达式求解
输入一个后缀表达式,程序求出表达式值。
错误原因:
- 没有考虑负数
解决:在判断数字的同时判断数字前边有没有负号