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错题代码截图

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

后续改进



posted @ 2019-04-21 21:38  何汐  阅读(363)  评论(0编辑  收藏  举报