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


    1.本周学习总结

    结构认识

    • 栈的结构认识:
      栈是一种只能在栈顶进行插入或删除操作的线性表,用于保存函数调用时所需要的信息。主要特点是“先进后出”,有顺序以及链式两种存储结构,主要运算算法包括入栈Push(注意是否栈满)、出栈Pop(注意是否栈空)。在我看来,栈类似于一口井,只有一个口,依次往里面放东西,只能逆序拿出来,无论是拿还是放,都只能在井口操作,这样理解就比较简单;
    • 队列的结构认识:
      队列是一种只能在一端进行插入操作,在另一端进行删除操作的线性表,主要特点是“先进先出”,也有顺序以及链式两种存储结构,主要运算算法包括入队Push(注意是否队满)、出队Pop(注意是否队空)。队列好像就是栈的一个升级,可以在两端操作,更加方便,在迷宫问题,也很明显表现出队列的优势。队列,顾名思义,有两端。

    学习体会

    • 这几周学习了栈和队列,基本运算算法也有相通之处,也同样需要画图来更好地理解,但还是觉得比之前的链表要稍稍容易掌握一点,更容易理解,
    • 额外
      • 除了栈和队列,还有学习到有关c++的容器,比如stack和queue,对于编程比较友好,运用起来也很简单(一定要记得调用的函数要加())
      • string数组的使用,类似于上面的容器,可以方便调用字符数组相关的函数,这些都使代码更简洁,有利于代码阅读;

    2.PTA实验作业

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

    本题要求在一个数组中实现两个堆栈。

    • 注意:如果堆栈已满,Push函数必须输出“Stack Full”并且返回false;如果某堆栈是空的,则Pop函数必须输出“Stack Tag Empty”(其中Tag是该堆栈的编号),并且返回ERROR。

    2.1.1代码截图


    2.1.2本题PTA提交列表说明。

    说明:

    • 对于指针的加减没有弄明白:T->Top1 初始值为-1,所以在进行入栈操作时,应该先让T->Top1值变为一,再让T->Top加一,因此应该使用++T->Top1,Top2同理;
    • 判断两个变量相等时用两个等于号!!!

    2.2 题目2:舞伴问题

    假设在周末舞会上,男士和女士们分别进入舞厅,各自排成一队。跳舞开始,依次从男队和女队队头各出一人配成舞伴,若两队初始人数不同,则较长那一队未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。 你需要用队列操作实现上述算法。

    2.2.1代码截图



    2.2.2本题PTA提交列表说明。

    说明:

    • 这道题是在devc上调试了很久才交上去,没有注意是两个空格,所以格式错误
    • 我觉得这道题没有很难,但是函数个数比较多,并且函数调用没有体现在主函数中,而是在一个小函数中反复调用,做的时候没啥思路看了一眼同学的代码,看完就敲出来,印象不是太深刻,所以上机考试碰到这道题时就没过。。。这道题确实还是很简单的。

    2.3 题目3:符号配对

    请编写程序检查C语言源程序中下列符号是否配对://、(与)、[与]、{与}。

    • 输入格式:
      输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。

    • 输出格式:
      首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?。

    2.3.1设计思路

    #输入
        字符串并存入一个数组中 (定义两个字符数组,分别存放左括号和右括号)
    #遍历数组   
       - 是左括号/左注释
            入栈
       - 是右括号
            栈不空
                与栈顶匹配,出栈
                与栈顶不匹配 配对失败,输出对应字符
            栈空
                 配对失败,输出对应字符
       #遍历结束
            栈空
                 配对成功
            不空
                  配对失败,输出对应字符
    

    2.3.2代码截图




    2.3.3本题PTA提交列表说明。

    说明:

    • 编译错误——刚开始在devc上写时,输入字符串时无论是getchar(),scanf,gets还是string函数的输入,都无法运行,我就百度了一下,发现devc可以用,但是pta过不去,换了一个版本的devc又可以了【此处应有狗头】,真的越来越觉得devc不靠谱了,还是得换成VS;
    • 其他错误——因为在遍历数组时,需要考虑的东西太多,理不太清楚,后来上课的时候老师讲解设计思路时就渐渐明白了
    • 有关于配对失败的字符输出,开始也一直弄错,比如遍历时如果栈顶无法与右符号配对,应该输出“?-右符号”,而遍历结束,如果栈不空,要输出“左符号-?”

    2.4 题目4:报数游戏

    报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(m<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。其中n是初始人数;m是游戏规定的退出位次(保证为小于n的正整数)。要求用队列结构完成。输出数字间以空格分隔,但结尾不能有多余空格。

    2.4.1设计思路

    【利用queue库、递归算法】
       #主函数
                - 建立队列q
                    1-n数字依次进队
                - n<m
                   error!
                - else
                   调用操作函数
       #操作函数
                - 当队列中只有一位数 
                输出队首
                - else
                遍历队列 
                       指定数字
                            输出队首且出队
                            调用操作函数(n-1,m)
                        其他数字
                            出队重新入队
    

    2.4.2代码截图


    2.4.3本题PTA提交列表说明。

    说明:

    • 队列的两道编程题都比较简单。。。银行那题比较平常,所以把这道题放上来,是想着这种做法比较独特,当是对于递归算法的一个小复习

    3、栈和队列上机考试

    3.1 错题一:舞伴问题

    代码可见上述实验作业

    3.1.2错题代码截图

    错误原因:

    考试的时候比较着急,这道题的小函数太多,且是小函数之间的调用,当时做作业的时候印象不深刻,所以根本不明白整个结构,只是大概记得有哪些东西,不知道往哪个函数里面塞,还是完全没有掌握这道题。

    后续改进

    在写pta的时候不能拿起题就做,还是得有个大概框架——伪代码,在没有思绪的地方也要一个人好好儿想想,不能因为不是特别难,就不思考。


    3.2 错题二:表达式求解

    输入一个后缀表达式,程序求出表达式值。

    3.1.2错题代码截图

    我当时看成了表达式转换,我就觉得我不会,就没有花时间写。。。。。。所以就没有代码了

    后续改进



  • 相关阅读:
    以多维数组的形式访问动态内存 笔记
    SQL对于 小数处理的小结
    备忘,搞不明白这是为什么
    生成3位的序列号_仅仅CASE WHEN的简单应用
    DataGridView导出数据到Excel
    Sql更新
    delphi使用RichView控件 表格保存和复制
    delphi使用RichView控件 表中选择
    delphi使用RichView控件 表格单元格合并
    delphi使用RichView控件 表格大小
  • 原文地址:https://www.cnblogs.com/victory0917/p/10744045.html
Copyright © 2020-2023  润新知