DS博客作业03--栈和队列
DS博客作业03--栈和队列
1.本周学习总结
本周我们主要学习了栈和队列的基本操作和应用。首先来说栈,栈只能在栈顶进行操作,是先进后出,可用于符号配对,走迷宫和计算后缀表达式等。栈可以分为顺序栈和链栈,运用于不同的情况。队列是先进先出,可在队头删除,也可以在队尾插入。队列也可分为顺序队和链队,在顺序队中,为了防止假溢出,又增加了循环队列。
在C++中的stack、queue类模板中,已经有写好的函数帮我们执行一些基础函数,所以我们要学会应用C++函数。本章节还应该熟记各种栈空、栈满、队空、队满的条件,并注意在出队,出栈和取队、栈时,都应该注意判断队列、栈是否为空。
2.PTA实验作业
函数题
2.1.题目1:6-2 在一个数组中实现两个堆栈
2.1.2代码截图
2.1.3本题PTA提交列表说明
(直接在PTA上写题的严重后果👇)
- Q1:不断的段错误段错误段错误。。。。
- A1:天真的我以为实现两个栈就是构造两个栈(丢人),其实是共享栈,一个栈顶从-1开始,一个栈顶从MaxSize开始。
- Q2:编译错误
- A2:对malloc函数的不熟悉,忘记malloc前面后面应该填什么。正确应该是S=(Stack)malloc(sizeof(struct SNode));。前面的括号是S的类型(之前定义的),后面的括号是要申请的类型的大小。
- Q3:改完上述的问题之后,依旧段错误(吐血)
- A3:题目的要求是这样的👇
可以看出这里的Data也需要动态申请内存,S->Data=(int *)malloc (MaxSize * sizeof(int));。
2.2.题目2:6-11 另类循环队列
2.2.2代码截图
2.2.3本题PTA提交列表说明
-
Q1:第一次编译错误
-
A1:
题目给的头文件为#include <stdio.h>即为C,cout是C++的函数,需要头文件#include。 -
Q2:第二个部分正确,错误的测试点是较大规模数据。
-
A2:我当时觉得我自己写的蛮对的。后来注意到题目给的是循环队列,好吧,所有的Front和rear都应该是循环+1。
-
Q3:输出超限!!!!!
-
A3:我居然把循环队列的队满和队空的条件记反了!!!,一般的循环队列(不是特指本题),队空的条件为:rear==front;队满的条件为(rear+1)%MaxSize==front。
-
Q4:我在写博客园的时候,就疯狂试探,发现如果按下图操作的话,pta仍然认为我运行超时??
-
A4:待解答。
2.3.题目3:银行业务队列简单模拟
2.3.1设计思路
建立两个队列,分别存放奇数和偶数;
若两个队列均不为空:
输出奇数队列的队首
出队
再输出一个奇数队列队首
再出队
输出一个偶数队列
出队
输出剩下某个队列中的全部元素。
2.3.2代码截图
2.3.3本题PTA提交列表说明
- Q1:看到这个题目的第一眼,就用了数组。。。
- A1:既然是在队列的题目集里,就乖乖的用队列做吧。
- Q2:最小的N(即N=1)时格式错误
- A2:当N=1即队列中只有一个队列中有一个数时,输出的数字前会多一个空格。在源代码下面添加了对N=1的特殊判断。
2.4.题目4:7-2 jmu-ds-符号配对
2.4.1设计思路
遇到左符号:
进栈;
遇到右符号:
判断这个右符号与栈顶元素是否匹配
匹配,则出栈;
不匹配,则结束
若栈空:说明全部匹配。
2.4.2代码截图
2.4.3本题PTA提交列表说明
- Q1:当左右符号不匹配,栈空时(即多了左符号),会段错误。
- A1:在取栈顶的时候没有判断栈是否为空,所以导致段错误。在每次出栈、取栈顶时,都要注意判断栈是否为空。
- Q2:一连续的错误。
- A2:这个纯属智障,,把7-3的升级版符号匹配题的代码一直发到7-2,导致一直错误。。。。
3.栈和队列上机考试之错题及解决办法
错题3.1
题目3.11:
输入一个后缀表达式,程序求出表达式值。
错题代码3.1.2:
3.1.3设计思路
遍历字符串
若'0'<poster[i]<'9'
转化为数字
入栈
continue;
若遇到运算符
取栈顶value1;
出栈
再取栈顶
出栈
用switch进行运算
将计算结果入栈
遍历结束
取栈顶为最后结果
程序结束
3.1.4错题原因:
经过调试之后,还有部分分数没拿到。没有考虑到输入的数字是负数的情况,从而导致段错误,即在栈空的情况下,仍然出栈。
3.1.5需改进部分
目前整个代码也有待提高,switch语句进行的计算其实可以用一个函数来代替,不需要那么麻烦。
对于负数,要在循环中特别判断,应该就可以了。
错题3.2
题目3.2.1:
请编写程序检查C语言源程序中下列符号是否配对:/*与*/、(与)、[与]、{与}。
输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。
输出格式:
首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?。
这道题呢,是pta原题,所以还是把pta的提交列表发出来吧。
错题代码3.2.2:
3.2.3设计思路:
没遇到‘.’时遍历字符串
遇到左符号"([{"
进栈该左符号
遇到左符号/*
两个左符号都进栈
遇到右符号")]}"
若栈空,直接结束,并输出
若栈不为空
若与栈顶匹配
出栈,继续遍历
遇到右符号*/
若栈空,直接结束,并输出
若栈顶不为*,直接结束
若栈顶为*
出栈,再取栈顶
若栈顶为/ 则匹配,再出栈
若栈顶不为/,则直接结束
遍历结束
若栈不为空
则不匹配
若栈空
则为匹配
3.2.4错误原因分析:
1.对题目“当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束”没有达到要求。C++语法中的cin输入函数遇到空格就会结束。while循环的话,只要遇句点“.”时就会直接结束输入(即不管句点后面有没有回车都会结束)
2.我的代码将遇到/*和*/情况都单独拿出来分析,与遇到左符号、遇到右符号的代码有很多的重复的地方,但是好像也不好删减,反正整个代码显得很杂,看的很难受。而且对/*和*/的处理常常会出错。
3.这题也是PTA原题,当时我把所有题目都浏览一遍的时候,我就决定这道题不写了,因为之前已经想过很久,我并不认为我可以在考试的两个小时内写完我两天没写好的题目,就放弃。
3.2.5改进部分:
以下为正确代码👇