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

1.本周学习总结

  • 1. 感觉栈和队列难度很大,特别是表达式求值还有符号配对,这真心很困难,打PTA打的特别心塞,都不会啊,而且编程量大,需要考虑的东西很多,光是看书就看得头晕,看了很久才会懂点,好在有老师介绍的容易,通过两个头文件#include 和#include 两个头文件,接下去再进行入栈出栈入队出队操作时候会方便些,但是还是得细心些,比如top和pop的区别,一个只取栈顶不去栈顶,另一个则相反
  • 2. 一开始老师刚讲栈时候...我一直把栈听成...寨...。栈是遵循“先进后出”原则,而且进出栈只能是从栈顶进行操作,队列和栈有点不一样,队列就像现实生活中的排队,从队头出队,从队尾进入,符合先进后出原则。两者都作为线性结构,有着异同点,栈和队列两者在进行插入和删除上时间复杂度都是O(1),在空间复杂度上两者也一样,插入的操作都被限制在栈顶或者队尾也就是尾部。两者不同于删除元素的位置不同,栈的删除在栈顶,队列的删除则在队头。还有应用场景的不同:栈用于括号问题还有表达式的转换和求值,深度搜索,函数的调用和递归等。而队列用于计算机系统中各种资源的管理,消息缓冲器和广度优先搜索等等

2.PTA实验作业

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

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

2.1.2代码截图

DS博客作业03--栈和队列_第1张图片
DS博客作业03--栈和队列_第2张图片

DS博客作业03--栈和队列_第3张图片

2.1.3本题PTA提交列表说明。

DS博客作业03--栈和队列_第4张图片

  • 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也能过得去
DS博客作业03--栈和队列_第5张图片
DS博客作业03--栈和队列_第6张图片
DS博客作业03--栈和队列_第7张图片

2.2.3本题PTA提交列表说明。

DS博客作业03--栈和队列_第8张图片

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

DS博客作业03--栈和队列_第9张图片

DS博客作业03--栈和队列_第10张图片

DS博客作业03--栈和队列_第11张图片

2.3.3本题PTA提交列表说明。

DS博客作业03--栈和队列_第12张图片

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

DS博客作业03--栈和队列_第13张图片

DS博客作业03--栈和队列_第14张图片

DS博客作业03--栈和队列_第15张图片

2.3.3本题PTA提交列表说明。

DS博客作业03--栈和队列_第16张图片

  • Q1:一开始答案错误,一份也没有,还有后面只过了个测试点得了十五分
  • A1:起初忘记了每次输出完k要置为0,导致错误,而后面输出的判断条件少了一句,i大于sum的情况,也就是k不等于2情况下 但还有数没输出
  • Q2:还有些编译错误,那是粗心造成的
  • A2:判断条件中因为括号有点多,所以少加了个括号,也没去注意就直接提交PTA导致编译错误

3、栈和队列上机考试

3.1.1 题目 6-2 jmu-ds-舞伴问题

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

DS博客作业03--栈和队列_第17张图片

3.1.2 代码截图

DS博客作业03--栈和队列_第18张图片

DS博客作业03--栈和队列_第19张图片

DS博客作业03--栈和队列_第20张图片
DS博客作业03--栈和队列_第21张图片


3.1.3 错误原因 :

DS博客作业03--栈和队列_第22张图片

这是编译错误  我忘记了这是个void型的函数 还打算return个值 把这条删掉就可以了

DS博客作业03--栈和队列_第23张图片

答案错误   在输出的函数内 只将某一个队头给自增,另外一个没自增,导致输出错误,这没考试前我也有这样错误过...

3.2.1 题目 6-3 jmu-ds-表达式求解

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

3.2.2 代码截图

DS博客作业03--栈和队列_第24张图片

DS博客作业03--栈和队列_第25张图片

DS博客作业03--栈和队列_第26张图片


3.2.3 

DS博客作业03--栈和队列_第27张图片

错误原因 :

再存十位数的时候出错了,第一个不能进去再存进去,而且还要先出栈,再将这个十位数存进去

改进代码
![](https://img2018.cnblogs.com/blog/1474614/201904/1474614-20190421213359737-1145915857.png)

错误原因 :

再判断除数为0的情况错了,把除数和被除数搞混了

```
改进代码
DS博客作业03--栈和队列_第28张图片

3.4 学习体会

  • 1. 上机考还是难度大,有些题目是PTA原题打的时候还是会一脑子懵逼,还有运用容器会简单点,取栈顶去栈顶会方便容易点
  • 2.有些时候得考虑详细点,有时候就是细节问题,比如表达式求值这一题,应考虑到被除数为0情况的提示和排除,当遇到运算符号时,要出栈两个数,打得还是不够熟练,原题还是会出错

你可能感兴趣的:(DS博客作业03--栈和队列)