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

    1.本周学习总结

    1.对于栈和队列本身来说原理并不难,栈是先进后出表,而队列是先进先出表;
    2.对于栈,链式存储结构的栈相对于顺序存储结构的栈来说,其不存在栈满上溢出的情况,而本章中较多使用到一些库函数,对于栈stack库函数来说,取栈顶元素和出栈两个操作是分开的,且出栈前一定要先判断栈是否为空,如果为空则不能进行出栈操作;
    3.对于队列,在循环队列判断队满队空的情况需要注意,且要注意front和rear指针所指的初始位置,这对判断队满队空起很重要的作用;同样在使用queue库函数时,要注意判断队空和队满情况,且出队和取队头的操作也是分开的;
    4.应熟练掌握表达式转换,迷宫等题型。
    

    2.PTA实验作业

    2.1.题目1:7-3 符号配对 (20 分)

    请编写程序检查C语言源程序中下列符号是否配对:/*与*/、(与)、[与]、{与}。
    //输入格式:
    输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。
    //输出格式:
    首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?。
    

    2.1.1设计思路

    1.先将左右符号分别存在两个字符串中,并且相匹配的括号位置也要相同,便于查找并进行判断;
    2.定义两个字符ch和pre,分别存储当前输入的字符和其前一个字符;
    3.进入循环判断,当遇到pre为'.'且ch为'
    '时,推出循环;
    4.在循环中,当发现左括号,则将其存入栈中,这里单独判断'/*'括号的情况,看两个字符是否相连,是则两个字符依次入栈;而当发现右括号时,则判断是否与栈顶的字符的位置匹配,相同则栈顶字符出栈后接下去判断,否则输出提示错误;当发现右括号但是栈空情况,直接提示错误;
    5.跳出循环后,如果此时栈空,则全部括号匹配成功;若栈不空则提示错误。
    

    2.1.2代码截图



    2.1.3本题PTA提交列表说明。

    • Q1:一开始时候写这题时的思路是先把全部的字符串输入并存入一个数组中,输入字符串会出现错误位置停止运行的情况;
    • A1:检查代码发现代码运行停止位置的判断条件有误,所以增加前一个位置变量一起判断;
    • Q2:经过修改后发现只能通过正确匹配运算符的pta的点;
    • A2:说明中间判断条件并没有找出错误情况,而错误情况比较多,最后决定更改做题思路;
    • Q3:采用边输入边判断的方法,部分符号不配对的情况无法实现;
    • A3:主要难题是在/**/两个括号的配对问题上,需要连续的两次输入以便于判断两个字符是否组成了此括号来实现判断及出栈问题;

    2.2 题目2:7-4 表达式转换 (25 分)

    算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
    //输入格式:
    输入在一行中给出不含空格的中缀表达式,可包含+、-、*、以及左右括号(),表达式不超过20个字符。
    //输出格式:
    在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
    

    2.2.1设计思路

    1.先输入一串要进行转化的字符串并存入一个数组中;
    2.遍历字符串,当碰到优先级比栈顶运算符高的入栈;低的出栈并写入后缀表达式,再添加#字符进行分割;
    3.左括号和表达式首部增加判断负数的情况,当左括号和表达式首部后为负数时,直接将负号写入后缀表达式,并继续写入数字或'.',最后以#分割;
    4.当全部遍历完之后栈中还有字符,则依次出栈写入后缀表达式并以#分割;
    5.输出后缀表达式,遇到#则以空格形式输出,其余照常输出即可。
    

    2.2.2代码截图



    2.2.3本题PTA提交列表说明。

    • Q1:刚开始提交时出现格式错误;
    • A1:则是空格问题,在#空格输出条件后增加最后一个#不输出空格的条件;
    • Q2:本题的实现是基于对课本上代码的衍生,而后会有非整数即负数的情况没有考虑到;
    • A2:非整数情况通过在default条件中的while语句中增加等于‘.’的字符情况即可实现;而负数情况需要考虑表达式首和左括号后的情况,增加增加flag和flag1以便于判断,当符合条件就通过goto语句直接跳到default中的while语句中直接将-号存入后缀表达式中;
    • Q3:当进行修改后发现pta中的负数情况依旧不能通过;
    • A3:这个主要时pta提示信息有误,当碰到上述情况时,负号要输出,而正正号则直接舍去(如下图表达式即输出样例),直到这一点就很容易实现了。

    2.3 题目3:7-1 jmu-字符串是否对称 (20 分)

    编写一个算法利用顺序栈判断一个字符串是否是对称串。所谓对称串是指从左向右读和从右向左读的序列相同。
    

    2.3.1设计思路

    法一

    1.先输入一串字符串并存入数组中,通过遍历数组并依次全部入栈;
    2.再同时遍历栈和数组(从0位置开始遍历),依次判断字符是否相同,若不相同则说明字符串不对称;
    3.如果全部判断完成且没有发现不相同字符情况,则正确。
    

    法二

    1.先输入一串字符串并存入数组中,通过遍历数组并依次全部入栈;
    2.通过栈顶元素出栈并存入judge数组中,当栈顶元素与judge中的当前位置减1的字符相同时,进入判断栈中元素及judge中元素是否一一对应相等,若不同或则栈空或数组遍历结束在栈空之前,都是不对称的情况;
    3.只有当全部遍历结束后且栈空时字符串是对称的;
    

    2.3.2代码截图

    法一

    法二


    2.3.3本题PTA提交列表说明。

    • 本题主要展现方法一思路比较清晰简单的方法
    • Q1:针对方法二,部分正确情况,答案错误或者段错误;
    • A1:在遍历栈之前都要增加判断是否为栈空的情况,以防止编译时出现错误;

    2.4 题目4:6-12 jmu-ds-舞伴问题 (20 分)

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

    2.4.1设计思路

    //注:本题没有写入队列和出队列两个函数,而是将这两个操作都在配对舞伴函数中实现。
    函数1 void DancePartner(Person dancer[], int num); //配对舞伴 
    1.先通过遍历已知数组,将数组中的男女舞伴依次入队列到相应队列中;
    2.判断两个队列长度,并将较短的队列长度值赋给len;
    3.遍历长度为len的两组队列,分别依次匹配舞伴并输出。
    
    函数2 int QueueEmpty(SqQueue &Q)//队列是否为空 
    判断头位置和尾位置是否相等,相等则说明队列为空返回-1;否则返回0。
    
    函数3 int QueueLen(SqQueue Q)//队列长度 
    返回头位置减尾位置的值即为队列长度。
    

    2.4.2代码截图


    2.4.3本题PTA提交列表说明。

    • Q1:在名字存储上出现问题;
    • A1:因为函数题中并没有给我们提供可以直接赋值字符串的头文件,所以只能通过遍历名字数组,一个字符一个字符赋值来实现;
    • Q2:出现格式错误;
    • A2:原因主要是输出了舞伴性别,而题目中并没有要求。

    3、栈和队列上机考试(错题及解决办法)

    3.1错题一:7-2 jmu-报数游戏 (20 分)

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

    3.1.1 错题代码

    3.1.2错误原因、改正方法及体会

    • Q:主要由于在舞伴问题上花费太多时间,导致来不及做后面的一些题目;只能先判断错误情况;
    • 改正方法:正确代码截图如下


    //设计思路
    1.先建一个从1开始,大小为规定人数的有序数组;
    2.遍历数组,找到报相应数的人编号将其进队列,并删除数组中该位置的值;
    3.最后将队列中的数依次出队列并输出即可。
    
    • 体会:做题速度和正确性都很重要,还有就是靠前的复习,可以提高在考试中编程速度。考试也就反应了平时

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

    输入一个后缀表达式,程序求出表达式值。
    //输入格式
    输入一行字符串,数据之间空格隔开
    //输出格式
    输出表达式值,若有除0表达式,输出divide error!
    

    3.2.1 错题代码

    3.2.2错误原因、改正方法及体会

    • Q:这题放后面写然后没有时间完成,而且当时思路也不清晰。
    • 更改方法:正确代码如下


    • 体会:在写这一题时,应考虑到被除数为0情况的提示和排除,再者就是出现空格时要有遍历的语句;原则是先遍历到的数先存进栈,而当遇到运算符号时,要出栈两个数,且先出栈的数为运算符号后面的数(如被除数或被减数),当要求的数组遍历完之后,最后栈顶的数即为所求的数。
  • 相关阅读:
    C#_.NetFramework_Web项目_EXCEL数据导出
    Linker Scripts3--简单的链接脚本命令2-Assigning Values to Symbols
    Linker Scripts3--简单的链接脚本命令1
    Linker Scripts2--链接器选项概述
    k64 datasheet学习笔记31---External Bus Interface (FlexBus)
    LwIP Application Developers Manual14---Further lwIP support
    LwIP Application Developers Manual13---Reporting bugs
    LwIP Application Developers Manual12---Configuring lwIP
    LwIP Application Developers Manual11---Initializing lwIP
    LwIP Application Developers Manual10---LwIP IPv4/IPv6 stacks
  • 原文地址:https://www.cnblogs.com/vanishzeng/p/10742398.html
Copyright © 2011-2022 走看看