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

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.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的状况错了,把除数和被除数搞混了数组

```
改进代码
函数

3.4 学习体会

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