第03次作业-栈和队列

Posted 陈玉婷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第03次作业-栈和队列相关的知识,希望对你有一定的参考价值。

 一、学习总结

1.我认为的本周学习中比较重要的知识点关键词

逻辑结构、栈、队列、存储结构

2.思维导图

(1)绪论

(2)顺序表

(3)栈和队列

二、PTA实验作业

题目一、7-2 符号配对

1.题目要求

 

2.设计思路

定义字符串 c 存放待匹配符号
定义字符栈 s 做匹配处理
定义 i,k 控制循环
将字符串输入并存入a,逐个判断a中的字符是否为
while(1){
        if 输入的是结束标志
            then 结束循环
        输入字符串a
        for(i=0;i<a.size();i++) 
            if a[i]是符号
                then 存入b
            else if a[i]是/*
                then 将<存入b且i+1
            else if a[i]是*/>存入b且i+1
        end
定义 n=k;
for i=0 to nif b[i]等于[、{、(或<
        then 将b[i]入栈
    else if 栈不为空
        if 栈顶元素与此时的b[i]匹配
            then 将栈顶出栈
        else
            将b[i]入栈
    else
        将b[i]入栈
end for
if 栈空 then输出YES else{ 输出NO 重置k=0 while 栈不空 将栈中元素逐个放入c中 将c数组中的元素逐个比较 for i=0 to k-1
for j=i+1 to kif 匹配 then c[i]c[j]都置为0 for i=0 to kif c[i]等于(、[、{ then输出c[i]-? 结束循环 else if c[i]等于\'<\' then输出/*-? 结束循环 else if c[i]等于\'>\' then输出?-*/ 结束循环 else if c[i]等于)、]、} then输出?-c[i] 结束循环 end

 

3.代码截图

4.PTA提交列表说明

错误点:在缺右边或缺左边时会出现错误。

解决方法:我多输入了几组测试数据,发现结果时而正确时而错误。后来发现在判断符号是否匹配的函数(if_match函数)中,我只判断了()、{ }、[ ]、/* */这些情况,忽略了反过来也照样配对的情况。所以最后我在if_match函数中de条件循环的条件中补充了这些判断,结果就正确了。

题目二:7-1 jmu-报数游戏

1.题目要求

2.设计思路

void number(int i,int n)
{
    if n大于i
        输出error!
    else{
        定义i,j控制循环
                定义length保存队列长度
        定义元素类型的元素e
        创建队列q
        for j=1 to i
            将j入队
end for
while 队列长度大于n 一个元素出队并存放到e中且k+1 if k等于n then 输出e 并重置k为零 else 将e入队 计算此时队列长度 } while 长度不为零 一个元素出队并存放到e中 if 队长为1 then 输出e else 输出e(空格) 长度减一 }

 

3.代码截图

 

 

 

4.PTA提交列表说明

错误点:m<n时,答案错误

未修改前:                                                             正确结果应是:

               

修改方法:在number函数中第一个while循环结束的标志是队列长度小于给定n,在这个while循环里,我先计算了队列长度再进行其他操作,导致其他操作对队列长度的影响要在下一次while循环中才能体现,所以出现了上述错误。修改方法是将计算队列长度的运算式放在while循环内的最后一条语句。

题目三、7-3 银行排队问题之单队列多窗口服务

1.题目要求

2.设计思路

定义数组 wintime 存放各个窗口的等待时间
定义数组 winnum 存放各个窗口的顾客数
定义 sumwait为总的等待时间,lenwait为最长的等待时间,wait为单次等待时间  (全初置为零)
while 栈不为空
定义 minwait最快的完成时间(先设为无穷大),minindex为最快完成时间的下标(初值为零)
定义 flag 标记变量
    for i=0 to k 遍历k个窗口
        if 队列首位,到达时间比完成时间大,就代表不需要等待
                then 更新完成这个窗口完成的时间
            窗口人数加一
            标记一下,代表不需要等待
            队首元素出队 
            结束循环 
        if 需要等待
                    then 记录各个窗口里最快完成的那个窗口的完成时间,和下标
    end for
    if需要等待
    then 等待的时间等于最快完成的时间减去队列第一个人到达的时间
        if最长等待时间小于等待时间不断更新等待的最长时间
            then更新等待的最长时间
        求等待时间的和
        更新对应窗口的完成时间
        对应窗口人数++
        队首元素出队
end while
定义 maxtime为最大完成时间(初置为wintime[0]
for i=0 to k 
    if 最大完成时间小于wintime[i]
        then更新最大完成时间
end for

 

3.代码截图

4.PTA提交列表说明

三、本周题目集的最后排名

3.1栈PTA排名

 

 

 

 3.2队列PTA排名

 

 3.3我的总分

2分

四、代码阅读

代码功能:判断带头结点的循环双向链表中的数据结点是否对称

优点:代码条理简单清晰

代码地址:https://gitee.com/QueGuangRenChen/data_structure/blob/master/chpt02/6-5.cpp

 五、代码Git提交记录截图

 

 

以上是关于第03次作业-栈和队列的主要内容,如果未能解决你的问题,请参考以下文章

第03次作业-栈和队列

第03次作业-栈和队列

第03次作业-栈和队列

第03次作业-栈和队列

第03次作业-栈和队列

第03次作业-栈和队列