DS博客作业03--栈和队列
1.本周学习总结
本周学习的内容是栈和队列,相比前一单元的顺序表内容,容易了很多,操作上更加简便。顺序表包括顺序表和链表两块大内容,顺序表的操作主要有创建顺序表,查找顺序表中的元素,顺序表元素的插入和删除。链表的主要操作有头插法建表和尾插法建表,链表的遍历查找,有序链表的插入和删除以及两个有序链表的合并。而本单元的栈和队列内容则就简单的多。首先是栈,栈的特点就是先进后出,常用在程序对于符号配对的判断等功能,操作就是进栈和出栈,以及判断栈空栈满。其次是队列,队列的特点是先进先出,队列的内容也主要是进队和出队操作,以及判断队空和队满。这些操作用c++语法只需要stack和queue两个库函数就可以很快的实现。所以队列和栈的内容会比较简单一些。
2.PTA实验作业
2.1.题目1:
6-2 在一个数组中实现两个堆栈 (20 分)
本题要求在一个数组中实现两个堆栈。
2.1.2代码截图
2.1.3本题PTA提交列表说明。
·Q1:这道题是结合了vs和同学的帮助下完成的,所以没有太多提交记录,第一次遇到的问题就是maxsize直接用,没有动态申请内存,导致错误一直显示着。
·A1:在同学的指导下动态申请了maxsize。
·Q2:第二次的错误是在于对于top2指针直接指向-1,然后内存就崩了
·A2:改变了一下想法,指向maxsize试一下,歪打歪撞显示没有错误情况。
2.2 题目2:
6-11 另类循环队列 (20 分)
如果用一个循环数组表示队列,并且只设队列头指针Front,不设尾指针Rear,而是另设Count记录队列中元素个数。请编写算法实现队列的入队和出队操作。
2.2.2代码截图
2.2.3本题PTA提交列表说明。
·Q1:第一次输出超限了,说实话刚开始我还不知道是什么错误,后面仔细看了下是一个return没加上去。
·A2:在进队函数里面加上return
·Q2:第二次的多种错误是真的让我懵了,在编译器上调试的好好的,提交上去有问题。
·A2:在几个同学的共同研究下,也没找出问题,最后对比了一下他们的代码,改了一下空格问题,奇迹出现了
2.3 题目3
7-1 jmu-字符串是否对称 (20 分)
编写一个算法利用顺序栈判断一个字符串是否是对称串。所谓对称串是指从左向右读和从右向左读的序列相同。
2.3.1设计思路
这道题的设计思路是定义字符串数组存放输入的符号,定义一个栈,依次把数组中的元素存入栈中。在定义一个字符变量ch,把栈顶元素赋给ch,拿ch与数组进行比较,这样子就刚好是从后面开始与前面对比,然后进行判断是否相同并且执行相应操作。
2.3.2代码截图
2.3.3本题PTA提交列表说明。
·Q1:第一次提交漏洞有很多,首先是循环的判断条件,没有使用for循环,while循环的话条件设置的不行,然后没有写下栈空和栈满的判断。
·A1:增加了一个i的自增,没有想到要改变其他的东西
·Q2:看了其他同学的方式之后,分享了自己的算法,然后看了一下他的操作,恍然大悟,要加上判断条件,for循环能这么用
·A2:改变了整体的代码,for循环,加上判断。
2.4 题目4
7-5 jmu-报数游戏 (15 分)
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(m<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。其中n是初始人数;m是游戏规定的退出位次(保证为小于n的正整数)。要求用队列结构完成。输出数字间以空格分隔,但结尾不能有多余空格。
2.4.1设计思路
设置一个栈,定义一个数组,定义m和n变量,首先加入while循环存入元素,当i等于n的时候退出循环,接下来设置for循环数组元素入栈,判断当i=m的时候,出栈并且输出,全部出栈并且进入另一个栈出栈进入原来的栈,重复以上操作直到栈空。
2.4.2代码截图
2.4.3本题PTA提交列表说明。
·Q1:提交列表里面只有一条记录,这条记录是投机取巧的方式,正规方法还未提交上去,第一次遇到的问题是建立顺序序列的时候,建立的序列是char类型的
·A1:char类型导致下面的输出和自增变得不对称,所以改变了做法。
·Q2:第二次遇到的问题就是删除元素这个问题了,刚开始我想的是直接在队列里面通过进栈出栈删除掉,但是发现还没到水平做到直接删除。
·A2:改变了自己的做法,从数组里面删除。
3、栈和队列上机考试
错题1
6-2 另类循环队列 (15 分)
如果用一个循环数组表示队列,并且只设队列头指针Front,不设尾指针Rear,而是另设Count记录队列中元素个数。请编写算法实现队列的入队和出队操作。
错题代码
错误分析
这道题的错误原因在于自己没有对原题的清晰记忆,测试点过了就没有在去认真思考为什么,导致很多地方有漏洞。首先在于AddQ函数,第七行的Q->Front++就是错误的,定义了Count,如果再用Front自增的话,就会导致内存错误,接下来队尾的计算公式也没有好好记住,写了一个正常队列的return方式。其次是DeleteQ函数,队长指针自减写成了队头指针自增,还是队尾的计算公式错误,return值也是错误的。
反思
以后做完题目要好好的去思考这道题的方式是什么样子的,为什么要用Count指针进行操作,还有队尾的计算公式也是很值得去思考的问题,得记住题目的思路而不是简单的就过了。
错题2
7-1 符号配对 (20 分)
请编写程序检查C语言源程序中下列符号是否配对:/与/、(与)、[与]、{与}。
错题代码
错误分析
这道题本来的想法是蛮复杂的,设置循环,然后进行进栈和出栈操作,遇到左括号进栈当遇到右括号的时候进行switch判断,是否出栈,如果不出栈就输出,等到最后的时候再判断栈是否是空的,如果不是也进行相应的输出。在考试的时候没能实现这样子的代码,用的编译器是c++,所以没能自己找到错误的地方。
反思
还是要多做题提升自己的能力和水平,像这道题思路也不会非常的复杂,就是实现代码这一块做的还是很欠缺,所以接下来的时间里,多写一写题目,实现代码,才不会说遇到考试就慌张。
错题3
6-1 在一个数组中实现两个堆栈 (15 分)
本题要求在一个数组中实现两个堆栈。
错误分析
这道题在刚pta上做的时候就没有花很大的心思去思考说为什么要这样子做,刚开始做这道题的时候,没有想到要给maxsize动态申请内存,因为之前做的题都是直接用maxsize的,所以写的时候发现很奇怪,说为什么一直显示错误。然后就是两个栈对于栈顶的定义以及用法不清楚,考试的时候没有能回忆起来这道题的具体操作,所以没有能够写出这道题。
反思
以后的题目还是的多问问同学这道题的思路是什么,动态申请内存这方面一定得了解好,什么时候需要什么时候不需要,还有就是结构体里面的元素什么时候可以直接用,什么时候还需要进行别的操作,这些都是要多加询问和记忆的。
错题4
6-3 jmu-ds-表达式求解 (20 分)
输入一个后缀表达式,程序求出表达式值。
错题代码
错误分析
这道题在考试的时候是投机取巧过了一个测试点,主要思路在于对后驱表达式的理解以及应用,考试的时候我一直没能算出题目中给的后驱表达式的计算方法,所以这道题的代码就没能实现,这道题主要是对于强制类型转化和符号的判断,当遇到运算符号的时候,把之前的栈中元素出栈,并且转换成int类型进行计算,存储在另外一个数组中,一次对于数组中的元素运用计算方法删除,并且使用一个变量存储计算之后的结果。
反思
对于后驱表达式来说,最主要的还是理解和计算方面,上学期c语言中的强制类型转化也没有学的很好所以很多的区域没有去实现,这道题的思路还是难在数组怎样去进栈出栈以及怎样转化去进行运算,包括对于一段运算之后的存储,也是一个问题。