DS博客作业03--栈和队列
1.本周学习总结
1.通过学习栈,我知道了栈是一种基本运算受限的线性表,只允许从栈顶一端进行操作,另一端为栈底(就比如在生活中叠盘子,第一个放上去的为栈底,最后一个放上去的为栈顶),栈顶是动态的,入栈出栈就是在栈中添加或删除一个数据,随着栈顶也跟着变化,由于这种操作受限,栈也遵循“先进后出”的原则。
2.队列也是一种操作受限的线性表,只允许在队列的队头进行删除操作(出队),在队尾进行添加操作(入队),(就像现实生活一队人过独木桥),队列的队头队尾都是动态的,出队后其后继元素成为新的队头,进队后新的元素成为队尾元素,由于这种操作的特点,先进的元素先出,队列也叫“先进先出表”。
3.栈和队列的学习,感觉算法思想理解起来并不是很难,但是把那些算法用代码实现起来就是另外一回事了,由于c语言基础薄弱在刷题的时候效率比较低,平时打pta都是要经常请教同学,在同学的帮助下学会了用c++中的类,在刷题时候多少提高了些效率,但是还是与同学有很大差距。
2.PTA实验作业
2.1题目一:7-0 jmu-ds-栈与队列-stack、queue与string小综合
2.1.1设计思路:
本题本来打算用c语言,但写起来代码量大还复杂,在同学的推荐下看了c++的类,写起来简便多了。具体思路就是建栈和队列,把字符串依次入栈,在出栈时通过遍历栈中的元素,把与不同于题目要求的元素进队列,最后出队时通过遍历队头来输出队中的每一个元素。
2.1.2代码截图
2.1.3本题PTA提交列表及说明
Q1:在遍历栈并把栈中元素入队时把出栈那一行代码位置放错了,导致栈顶元素还没和特定的元素对比就已出栈;
A1:把s.pop()放在条件判断之后就解决了这个问题;
Q2:在最后遍历队列并输出队列元素时候忘了出队,导致输出时候一直只输出队头那个元素进入了死循环;
A:仔细观察了代码后加了出队那一行代码就ok了;
2.2题目二:7-1 jmu-字符串是否对称
2.2.1设计思路
判断一个字符串是否对称,建栈来存放一个字符串,利用栈先进后出的特点,通过遍历栈顶元素、出队、将栈顶元素与字符串从第一个字符开始比较,若相等则说明对称,不等则不对称;
2.2.2代码截图
2.2.3本题PTA提交列表及说明
Q1:在devc上写好后测试了对称的情况就全部贴到pta,发现字符串不对称那个点老是不过;
A2:又测试了不对称的情况发现还是输出yes,最后发现是flag没赋初值;
2.3题目三:6-1 另类堆栈
2.3.1设计思路
另类堆栈的实现,实际上也就是栈顶指针的位置在原有的判断栈空或栈满时栈顶指针Top往上加1,在进栈出栈时的操作与原本的操作并没有什么变化;
2.3.2代码截图
2.3.3本题PTA提交列表及说明
2.4题目二6-2 在一个数组中实现两个堆栈
2.4.1设计思路
在一个数组中实现两个栈,由于数组有两个端点,也就可以看做两个栈底,让一个栈底为数组的起始端,一个栈底为数组的末端,这样在两个栈中进栈时元素就往中间延伸,但要注意区分两个栈进栈出栈的操作以及判断栈空栈满时条件的不同;
2.4.2代码截图
2.4.3本题PTA提交列表及说明
Q1:刚开始一直答案错误,是在写进栈那个函数把判断栈1栈2那个条件放在了判断栈是否满那个条件下,怎么也不对
A2:将判断栈1栈2那个条件放在了最外面,进栈这一块就没了问题,但还是有两个测试点没过;
A2:发现是出栈时没判断栈是否为空,而且出栈时对指针的操作也出现错误;
3.栈和队列上机考试
1.6-2 另类循环队列
错误原因:在做栈与队列的题目时还没做到这个题目,在考试前面复习了一下仅仅凭记忆直接去pta上打,在进队之后没有把队列中元素个数加1,一直提示编辑错误都不知道从哪里改;
解决办法:不能靠死记硬背,要理解算法思想,以后不能在一两个题目上卡住就不去做其他题目,还是要花更多的时间去打代码,提高刷题的效率;