1.本周学习总结
- 1. 感觉栈和队列难度很大,特别是表达式求值还有符号配对,这真心很困难,打PTA打的特别心塞,都不会啊,而且编程量大,需要考虑的东西很多,光是看书就看得头晕,看了很久才会懂点,好在有老师介绍的容易,通过两个头文件#include
和#include 两个头文件,接下去再进行入栈出栈入队出队操作时候会方便些,但是还是得细心些,比如top和pop的区别,一个只取栈顶不去栈顶,另一个则相反 - 2. 一开始老师刚讲栈时候...我一直把栈听成...寨...。栈是遵循“先进后出”原则,而且进出栈只能是从栈顶进行操作,队列和栈有点不一样,队列就像现实生活中的排队,从队头出队,从队尾进入,符合先进后出原则。两者都作为线性结构,有着异同点,栈和队列两者在进行插入和删除上时间复杂度都是O(1),在空间复杂度上两者也一样,插入的操作都被限制在栈顶或者队尾也就是尾部。两者不同于删除元素的位置不同,栈的删除在栈顶,队列的删除则在队头。还有应用场景的不同:栈用于括号问题还有表达式的转换和求值,深度搜索,函数的调用和递归等。而队列用于计算机系统中各种资源的管理,消息缓冲器和广度优先搜索等等
2.PTA实验作业
2.1.题目1:6-2 在一个数组中实现两个堆栈
本题要求在一个数组中实现两个堆栈。
2.1.2代码截图
2.1.3本题PTA提交列表说明。
- Q1:一开始各种错误,主要是段错误和答案错误,代码思维上...好像是没错的
- A1:我初始化栈时候,将两个栈的Top分别置为0和1,然后也没注意看懂题目的意思,以为两个栈是是以奇数偶数来区别,就以这种形式来初始化栈,还连空栈,栈满情况的条件考虑得好好的
- Q2:后来舍友跟我说,书本上有代码,我就看着书本打一遍代码,然后还是有错,只不过全变成输出超限这个错误
- A2:这输出超限是因为我栈满条件的判断错误,我一开始以为栈满的条件是Top1等于Top2,这样子错误了,如果真的这样子的话他们就会有个空间进行重复了,而正确的栈满判断条件应该是Top1是等于Top2减一,这样子才正确
- Q3:改进了栈满条件后,再提交PTA后还是输出超限的问题,栈空的判断条件我也错了
- A3:栈空条件我以为是只要任何一个为栈空的情况,都得返回ERROR,所以其实这样谈房子栈空情况下他还是继续进行操作,后来我改进代码,在判断条件为空情况下,将他们分开来判断,
2.2.题目2:6-12 jmu-ds-舞伴问题
假设在周末舞会上,男士和女士们分别进入舞厅,各自排成一队。跳舞开始,依次从男队和女队队头各出一人配成舞伴,若两队初始人数不同,则较长那一队未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。 你需要用队列操作实现上述算法。请完成下面5个函数的操作。
2.2.2代码截图
这道题只提交这三个函数 PTA也能过得去
2.2.3本题PTA提交列表说明。
- Q1:一开始答案和PTA的正确答案差了一格 就是跳过了张1 王2 直接输出林1 薛2
- A1:我在将女性的姓名每一个字符存进去的for循环中,我还将rear队尾每次都给自增了,导致他最后输出错误答案。后来的编译错误是因为我不注意在cout中又加了个cout,导致编译错误,还有本来想用C语言中的赋值函数,没想到头文件中没有string
- Q2:在多种错误中,有运行超时和答案错误
- A2:在输出舞伴的while循环中,我判断条件为i小于等于人数少的那个,这样就导致输出超时了,因为队列中最多含有(MAXSIZE-1)个元素,在临界条件下他就没有相应的数来输出,才导致错误,格式错误是因为题目要求两个空格来隔开,可我只用一个空格
2.3.题目3:7-2 jmu-ds-符号配对
假设表达式中允许包含3种括号:圆括号、方括号和大括号。即(,[,'{'。编写一个算法判断表达式中的括号是否正确配对, 要求利用栈的结构实现。
2.3.1设计思路
先遍历字符串str,遇到左括号就入栈st,碰到右括号就先判断栈st是否为空,栈空则证明缺少左符号返回false,如果栈不空则取栈顶字符于e,如果不匹配右符号则将flag置为0。遍历完字符串,如果此时栈空并且flag为1,则返回true,不为空则按要求操作
2.3.2代码截图
2.3.3本题PTA提交列表说明。
- Q1:一开始有个多种错误,里面有段错误还有答案错误
- A1:我最后判断栈空的条件时候,忘记如果栈空的话返回的是1而栈不空返回的则是0,我就用!st.empty()来判断栈空,导致了错误
- Q2:后面还有五分没能拿到,错误为括号不匹配 栈空的测试点过不去
- A2:在遇到右符号时候,忘记了得先判断栈是否为空,栈空则错误则返回
2.3.题目4:7-6 银行业务队列简单模拟
设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。
2.3.1设计思路
定义数组a来存放输入的数,通过sum来记录下奇数的最后一个数的位置,遍历整个数组,如果为奇数输出,还有控制空格的输出,k自增来计算奇数有几个 ,如果是偶数则入队列,判断k是否等于2或者i大于sum值 如果满足其一,再判断sum值是否等于初值,是则输出队头并将sum置为-2 否则控制输出 并将k重新计数
2.3.2代码截图
2.3.3本题PTA提交列表说明。
- Q1:一开始答案错误,一份也没有,还有后面只过了个测试点得了十五分
- A1:起初忘记了每次输出完k要置为0,导致错误,而后面输出的判断条件少了一句,i大于sum的情况,也就是k不等于2情况下 但还有数没输出
- Q2:还有些编译错误,那是粗心造成的
- A2:判断条件中因为括号有点多,所以少加了个括号,也没去注意就直接提交PTA导致编译错误
3、栈和队列上机考试
3.1.1 题目 6-2 jmu-ds-舞伴问题
假设在周末舞会上,男士和女士们分别进入舞厅,各自排成一队。跳舞开始,依次从男队和女队队头各出一人配成舞伴,若两队初始人数不同,则较长那一队未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。 你需要用队列操作实现上述算法。请完成下面5个函数的操作。
3.1.2 代码截图
3.1.3 错误原因 :
这是编译错误 我忘记了这是个void型的函数 还打算return个值 把这条删掉就可以了
答案错误 在输出的函数内 只将某一个队头给自增,另外一个没自增,导致输出错误,这没考试前我也有这样错误过...
3.2.1 题目 6-3 jmu-ds-表达式求解
输入一个后缀表达式,程序求出表达式值
3.2.2 代码截图
3.2.3
错误原因 :
再存十位数的时候出错了,第一个不能进去再存进去,而且还要先出栈,再将这个十位数存进去
改进代码
![](https://img2018.cnblogs.com/blog/1474614/201904/1474614-20190421213359737-1145915857.png)
错误原因 :
再判断除数为0的情况错了,把除数和被除数搞混了
改进代码
![](https://img2018.cnblogs.com/blog/1474614/201904/1474614-20190421213643716-1239883074.png)
##3.4 学习体会
+ **1.** 上机考还是难度大,有些题目是PTA原题打的时候还是会一脑子懵逼,还有运用容器会简单点,取栈顶去栈顶会方便容易点
+ **2.**有些时候得考虑详细点,有时候就是细节问题,比如表达式求值这一题,应考虑到被除数为0情况的提示和排除,当遇到运算符号时,要出栈两个数,打得还是不够熟练,原题还是会出错
***