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

1.本周学习总结(0--1分)

  • 本周对栈和队列进行了学习,刚开始看上去还挺唬人的,但是开始写题之后发现,栈和队列无非就是两种结构而已,还有stack()和queue()可以用,简直不要太方便。然后感触就是在写程序的时候不要想得非常具体,而是要基于这两种结构想他们的特点,这些特点能解决什么问题,解决问题的过程具体要怎么样,在脑子中构建出这整个过程。
  • 队列其实可以看作是一种特别的线性表,一种对存储有特定要求的线性表。先进先出,就像平常的排队一样,先排队的先处理,后排队的后处理。主要运算算法包括入队Push(注意是否队满)、出栈Pop(注意是否队空)。在C++中,队列的实现被封装在类queue中,该类存在于头文件中。
  • 栈跟队列一样,也是一种特殊的线性表,其特殊的地方也是在存取这方面。队列的特性是先进先出,栈则是后进先出,像叠盘子一样。在C++中,有类stack类封装了对栈的实现。队列只允许在一端进行插入操作,而在另一端进行删除操作。

2.PTA实验作业(6分)

2.1题目一 6-2 在一个数组中实现两个堆栈 (20 分)

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

2.1.1代码截图

1474715-20190423223650393-1455456860.png

2.1.2本题PTA提交列表说明

1474715-20190424164344857-511154616.png
本题一次性过关,主要是共享栈的设计,使其有两个栈底,一个为下标为0处,另一个为下标为maxsize-1处,进栈时一个下标从0开始加,另一个从maxsize-1开始减。

2.2题目二 6-12 jmu-ds-舞伴问题 (20 分)

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

2.2.1代码截图

1474715-20190424165108924-55699216.png
1474715-20190424165116077-1049192015.png
1474715-20190424165122186-1509541968.png

2.2.2本题PTA提交列表说明

1474715-20190424165205326-1101798701.png

  • Q1:一开始出现编译错误
  • A1:看了pta提交时的解释发现->不识别,写指针写习惯了,在用结构体的时候习惯写p->sex,用p.sex才是对的
  • Q2:开始时出现格式错误,百思不得其解,看起来输出都是一模一样的
  • A2:后来反复对比了很久,输出时姓名之间的空格是两个...不是一个...

2.3题目三 7-2 jmu-ds-符号配对 (15 分)

假设表达式中允许包含3种括号:圆括号、方括号和大括号。即(,[,'{'。编写一个算法判断表达式中的括号是否正确配对, 要求利用栈的结构实现。

2.3.1设计思路

    定义字符型数组s 输入s
    for循环i=0 to i<len
    不是符号  跳过以下语句
    为左符号 进栈
    为右符号
         栈空 退出程序(因为右符号没有左符号和它配对 表达式已经配对错误了)
         为右符号且配对 出栈
    结束for循环
接下来判断是否配对成功
    栈空且i=len  配对成功
    i不等于len 配对失败,输出no以及栈顶(栈为空不输出)

2.3.2代码截图

1474715-20190424170621275-68063424.png
1474715-20190424170627909-1967940096.png

2.3.3本题PTA提交列表说明

1474715-20190424170757851-2019750155.png

  • Q1:最初提交,两个测试点过不去,当括号不匹配且栈空时出现段错误
  • A1:发现忘了最重要的在出栈时没判断栈是否为空,导致程序崩溃
  • Q2:后来在判断是否配对成功的问题上遇到了困难,之前觉得只要栈空就是配对成功,后来发现不是这么回事
  • A2:有时候如果只有右符号,栈一直是空的,但是很明显是配对错误的,所以引入一个len,当i<len时,即使栈中为空也是配对错误。

2.4题目四7-5 jmu-报数游戏 (15 分)

报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(m<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。其中n是初始人数;m是游戏规定的退出位次(保证为小于n的正整数)。要求用队列结构完成。输出数字间以空格分隔,但结尾不能有多余空格。

2.4.1设计思路

    定义m,N,数组line
    定义队列qu;
    m<N
        数组line中的N个元素全部进队
        队列qu不为空  
        报数m次,不为m的报数后重新入队,报数为m的直接出队 ,输出
    m>=N 输出输入错误

2.4.2代码截图

1474715-20190426202108671-527215958.png
1474715-20190426202117799-329011639.png

2.4.3本题PTA提交列表说明

1474715-20190426203538712-1109531657.png
本题一次性过关,感觉这题挺简单的,主要就是队列的不断出队和重新入队,利用队列先进先出的特点解决问题。

3、栈和队列上机考试(-3--3分)

3.1错题一:7-1 jmu-ds-符号配对 (20 分)

3.1.1代码截图

1474715-20190426204641184-179494264.png
1474715-20190426204653060-1869744898.png

3.1.2分析错误原因

先贴上上机考时的提交列表
1474715-20190426204817652-1909764813.png
这题是pta上已经做过的题了,上机考的时候考到这题,本来挺自信的,觉得应该挺快就能写出来,但是还是犯了很多小错误,忽略很多细节到导致这题因为测试点没有全部过去,调试了挺久的,然后考试时就没时间做其他的题了。首先还是出现了段错误,总是在出栈时忘记判断栈是否为空,我这脑子...怎么就记不住呢。然后就是配对时有很多情况没考虑充分,反反复复调来调去。结束后上机时的代码和之前在pta栈和队列上写的代码比较了下,发现上机考的时候写的会混乱比较多,虽然也是对的,但是有些情况之间写的比较重复,有重叠的部分,在考试的时候脑子比较混乱,想到的情况就叠加上去,只想着把测试点过去,代码思路会比较乱。

3.2错题二:6-3 jmu-ds-表达式求解 (20 分)

3.2.1代码截图

这题在上机考的时候没有写出来,所以没有代码。主要之前pta上中缀转后缀的题就没有怎么搞清楚,然后遇到这种类似的题就没啥自信能写出来,直接跳过去做其他的题了。现在贴上这道题的正确代码
1474715-20190426212643179-148715907.png
1474715-20190426213528876-2035895557.png

3.2.2错误原因分析

因为没写出来,所以也没办法分析上机考时的错误,这里说一下这道题的设计思路吧。

遇见正数 直接入栈
遇见负号,判断是负数还是减号 是负数将负数入栈
遇见运算符号 出栈两次进行相应的运算 其中要注意除号分母为0的情况

转载于:https://www.cnblogs.com/zyxaa/p/10747362.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值