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错题代码截图
我当时看成了表达式转换,我就觉得我不会,就没有花时间写。。。。。。所以就没有代码了
后续改进