zoukankan      html  css  js  c++  java
  • DS博客作业03--栈和队列

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

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

    2.PTA实验作业(6分)

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

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

    2.1.1代码截图

    2.1.2本题PTA提交列表说明


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

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

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

    2.2.1代码截图



    2.2.2本题PTA提交列表说明

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


    2.3.3本题PTA提交列表说明

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


    2.4.3本题PTA提交列表说明


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

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

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

    3.1.1代码截图


    3.1.2分析错误原因

    先贴上上机考时的提交列表

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

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

    3.2.1代码截图

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

    3.2.2错误原因分析

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

    遇见正数 直接入栈
    遇见负号,判断是负数还是减号 是负数将负数入栈
    遇见运算符号 出栈两次进行相应的运算 其中要注意除号分母为0的情况
    
  • 相关阅读:
    51nod 1179 最大的最大公约数 (数论)
    POJ 3685 二分套二分
    POJ 3045 贪心
    LIC
    HDU 1029 Ignatius and the Princess IV
    HDU 1024 Max Sum Plus Plus
    HDU 2389 Rain on your Parade
    HDU 2819 Swap
    HDU 1281 棋盘游戏
    HDU 1083 Courses
  • 原文地址:https://www.cnblogs.com/zyxaa/p/10747362.html
Copyright © 2011-2022 走看看