DS博客作业03--栈和队列

1.本周学习总结

  • 关于栈和队列,在我看来其实它们非常相似,都是一个容器,有进有出,比如迷宫问题,两者都可以解决。栈于队列出去的方式不同,栈是先进后出,队列是先进先出,它们的库函数的使用也十分相似,都有.push() .pop(),在学习的时候学会栈的库函数的使用方法,队列的库函数的使用也就差不多也跟着学会了,但是在取栈顶和取队头的时候就不一样了,一个是.top()另一个是.front(),刚开始学习的时候很容易弄混淆。
  • 前几周学习了链表后再来学习栈和队列,在理解的方面感觉更加的容易,至少它的组成部分,使用方法,怎么自己建栈建队列这方面比刚开始学建链容易上手多了,但是在一些判断上比如栈空,栈满,队空的判断上还是需要谨慎。

2.PTA实验作业

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

2.1.1伪代码

函数1 创建栈
    Stack S
    申请S,S->Data空间
    定义大小S->MaxSize=MaxSize
    定义栈顶
    S->Top1=-1;
    S->Top2=MaxSize;
    return S;
函数2 进栈
    if 栈满 then
    输出Stack Full
    return false
    if Tag==1 then
     S->Data[++S->Top1]=X
    return true;
    if Tag==2 then
     S->Data[--S->Top2]=X;
    return true;
函数3 出栈
    if Tag==1 then
        if 栈空 then
            输出Stack 1 Empty
            return ERROR;
        return(S->Data[S->Top1--])
   if Tag==2 then
        if 栈空 then
            输出Stack 2 Empty
            return ERROR;
        return(S->Data[S->Top2++])

2.1.2代码截图


2.1.3本题PTA提交列表说明。


问题1:对puts()函数的不了解,格式错误
解决1:put函数在输出后会自动换行,太久没有使用了,都忘记了,现在有回顾了一下。
问题2:这道题目中有两个栈顶,在判断栈空的时候的判断
解决2:Top1和Top2要分清楚,因为判断栈空的代码差不多就选择了复制粘贴,

两个都用Top1判断眼睛没有那么敏锐发现不了错误,等提交的时候才发现

2.2题目2: jmu-ds-舞伴问题 (函数题)

2.2.1伪代码

函数1 队列长度 
    return(尾-头)
函数2 加入队列 
    if Q->rear==MAXQSIZE then
        return 0;
    else
        Q->data[Q->rear++]=e
函数3 队列是否为空
    return(Q->front==Q->rear)
函数4 出队列
    if 队空
    return 0
    else
        e=Q->data[Q->front++]
函数5 配对舞伴 
    for i=0 to num then
        if 性别为男
            EnQueue(Mdancers,dancer[i])
        if 性别为女
            EnQueue(Fdancers,dancer[i])
    end for
    while 两队皆不空 do
        DeQueue(Fdancers,e)女出队列 
        cout<<e.name<<"  "
        DeQueue(Mdancers,e)男出队列 
        cout<<e.name<<endl
    end while

2.2.2代码截图

2.2.3本题PTA提交列表说明。



问题1:没看清题目,先输出女舞者在输出男舞者
解决2:提交完后又看了一眼样例,发现男女反了
问题2:格式错误
解决2:这次看样例,一瞄没有发现问题啊,但是数据没有错只能空格和换行的问题才会格式错误了,最后发现中间隔两个空格,意想不到。

2.3题目3: 表达式转换

2.3.1设计思路

这道使用栈,先把表达式进行一次循环,分成两部分,因为是后缀表达式数字要先输出,所以第一部分前面有左括号后面是减号的数字的小数点的输出直到不是前面几种数据为止控制空格的输出,第二部分对于符号的处理,又分三种处理的方式,第一种遇到右括号,除了左括号可以把栈中的符号出栈输出;第二种空栈或有更高优先级,进栈;第三种以上情况都没有,栈中元素输出直到遇到左括号。这两部分处理完把栈中的元素输出。(在输出的过程注意空格)

2.3.2


2.3.3本题PTA提交列表说明。



问题1:多种错误
解决1:首先解决一下格式错误,注意每一部分之间有空格,空格加上去后开始有得分了
问题2:部分正确,在小数的情况下没有考虑,正负号也没有判断,是运算符还是什么
解决2:在判断括号的时候随便判断正负,小数的话,判断下一个元素是否为小数点还是数字,都直接输出就可以了

2.4.题目4:jmu-报数游戏

2.4.1设计思路

按照题目的意思好像是一个圈圈,让人的第一想法可能是要用循环队列,然而可以使用简单的链式队列做,直接使用队列的库函数,设一个变量count进行数数
然后求余m,等于0的就出队,不等于0的就往后移,如此继续,直到队中没有元素。

2.4.2代码截图

2.4.3本题PTA提交列表说明。


问题1:首先对题目不怎么了解,以为剩下的人数小于m之后就不用管了
解决1:然而并不是这样,剩下小于m的人还要继续数下去,直到全部出队为止
问题2:编译错误,变量名的重复
解决2:真的很可怕,变量名取cout,然后寻找了好久都没发现出错误,这个东西真的要注意,变量名一定要规范。

3、栈和队列上机考试

有一个表情包特别能描绘这种感受:当事人:现在就是后悔,非常后悔

错题1:在一个数组中实现两个堆栈

这道题在做题的时候就又出现些错误,以前的错误都改过来了,然而又犯了新的错误。


  • 解决方法:建栈的时候最后记得return S;判断空栈的时候输出的Tag改成1和2

错题2:银行业务队列简单模拟

当时在刷题的时候这道题几乎没有任何细节的错误,一遍就过来,让我对这题很有信心,没想到有一个测试点一直过不了,但当时心情十分紧张,上机考又看不到测试点的具体内容,一直以为自己在栈空的时候没判断好,修改了几次,都没有解决。


  • 解决方法:在判断A窗口为空时,让B窗口的第一个数前后不加空格。
原文地址:https://www.cnblogs.com/linshuxin1761/p/10745237.html