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

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

1.本周学习总结

本周我们主要学习了栈和队列的基本操作和应用。首先来说栈,栈只能在栈顶进行操作,是先进后出,可用于符号配对,走迷宫和计算后缀表达式等。栈可以分为顺序栈和链栈,运用于不同的情况。队列是先进先出,可在队头删除,也可以在队尾插入。队列也可分为顺序队和链队,在顺序队中,为了防止假溢出,又增加了循环队列。
在C++中的stack、queue类模板中,已经有写好的函数帮我们执行一些基础函数,所以我们要学会应用C++函数。本章节还应该熟记各种栈空、栈满、队空、队满的条件,并注意在出队,出栈和取队、栈时,都应该注意判断队列、栈是否为空。

2.PTA实验作业

函数题

2.1.题目1:6-2 在一个数组中实现两个堆栈

2.1.2代码截图

1476233-20190421132133356-1990824767.png
1476233-20190421132221687-2021965606.png

2.1.3本题PTA提交列表说明

(直接在PTA上写题的严重后果?)
1476233-20190420182808272-1923228260.png

  • Q1:不断的段错误段错误段错误。。。。
  • A1:天真的我以为实现两个栈就是构造两个栈(丢人),其实是共享栈,一个栈顶从-1开始,一个栈顶从MaxSize开始。
  • Q2:编译错误
    1476233-20190421132850627-1159621207.png
  • A2:对malloc函数的不熟悉,忘记malloc前面后面应该填什么。正确应该是S=(Stack)malloc(sizeof(struct SNode));。前面的括号是S的类型(之前定义的),后面的括号是要申请的类型的大小。
  • Q3:改完上述的问题之后,依旧段错误(吐血)
  • A3:题目的要求是这样的?
    1476233-20190421133649946-157158384.png
    可以看出这里的Data也需要动态申请内存,S->Data=(int )malloc (MaxSize sizeof(int));。

    2.2.题目2:6-11 另类循环队列

    2.2.2代码截图

    1476233-20190420182322843-1651122027.png

2.2.3本题PTA提交列表说明

1476233-20190420181714813-1046533968.png

  • Q1:第一次编译错误
  • A1:1476233-20190417221747036-497479106.png
    题目给的头文件为#include <stdio.h>即为C,cout是C++的函数,需要头文件#include 。
  • Q2:第二个部分正确,错误的测试点是较大规模数据
  • A2:我当时觉得我自己写的蛮对的。后来注意到题目给的是循环队列,好吧,所有的Front和rear都应该是循环+1
  • Q3:输出超限!!!!!
  • A3:我居然把循环队列的队满和队空的条件记反了!!!,一般的循环队列(不是特指本题),队空的条件为:rear==front队满的条件为(rear+1)%MaxSize==front
    1476233-20190420180943707-1195190216.png

  • Q4:我在写博客园的时候,就疯狂试探,发现如果按下图操作的话,pta仍然认为我运行超时??
    1476233-20190420182146172-601271070.png
  • A4:待解答。

2.3.题目3:银行业务队列简单模拟

2.3.1设计思路

建立两个队列,分别存放奇数和偶数;
若两个队列均不为空:
    输出奇数队列的队首
    出队
    再输出一个奇数队列队首
    再出队
    输出一个偶数队列
    出队
输出剩下某个队列中的全部元素。

2.3.2代码截图

1476233-20190426221541582-2029367732.png
1476233-20190426221645688-615915024.png
1476233-20190426221712005-334672420.png

2.3.3本题PTA提交列表说明

1476233-20190426221737636-1778218688.png

  • Q1:看到这个题目的第一眼,就用了数组。。。
  • A1:既然是在队列的题目集里,就乖乖的用队列做吧。
  • Q2:最小的N(即N=1)时格式错误
  • A2:当N=1即队列中只有一个队列中有一个数时,输出的数字前会多一个空格。在源代码下面添加了对N=1的特殊判断。

2.4.题目4:7-2 jmu-ds-符号配对

2.4.1设计思路

遇到左符号:
    进栈;
遇到右符号:
    判断这个右符号与栈顶元素是否匹配
        匹配,则出栈;
        不匹配,则结束
若栈空:说明全部匹配。

2.4.2代码截图

1476233-20190427000628668-2102106986.png
1476233-20190427000737754-1930176436.png
1476233-20190427000847544-440008414.png

2.4.3本题PTA提交列表说明

1476233-20190427000953584-52465407.png

  • Q1:当左右符号不匹配,栈空时(即多了左符号),会段错误。
  • A1:在取栈顶的时候没有判断栈是否为空,所以导致段错误。在每次出栈、取栈顶时,都要注意判断栈是否为空
  • Q2:一连续的错误。
  • A2:这个纯属智障,,把7-3的升级版符号匹配题的代码一直发到7-2,导致一直错误。。。。

3.栈和队列上机考试之错题及解决办法

错题3.1

题目3.11:

输入一个后缀表达式,程序求出表达式值。

错题代码3.1.2:

1476233-20190426230503386-630761114.png
1476233-20190426230549767-825268879.png
1476233-20190426230629377-1508921278.png

3.1.3设计思路

遍历字符串
    若'0'<poster[i]<'9'
        转化为数字
        入栈
        continue;
    若遇到运算符
        取栈顶value1;
        出栈
        再取栈顶
        出栈
        用switch进行运算
        将计算结果入栈
遍历结束
取栈顶为最后结果
程序结束

3.1.4错题原因:

经过调试之后,还有部分分数没拿到。没有考虑到输入的数字是负数的情况,从而导致段错误,即在栈空的情况下,仍然出栈。

3.1.5需改进部分

目前整个代码也有待提高,switch语句进行的计算其实可以用一个函数来代替,不需要那么麻烦。
对于负数,要在循环中特别判断,应该就可以了。

错题3.2

题目3.2.1:

请编写程序检查C语言源程序中下列符号是否配对:/*与*/、(与)、[与]、{与}。

输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。

输出格式:
首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?。
这道题呢,是pta原题,所以还是把pta的提交列表发出来吧。

错题代码3.2.2:

1476233-20190427104503171-663109202.png
1476233-20190427104923215-607920092.png
1476233-20190427105008731-1670621623.png
1476233-20190427105149617-384886909.png
1476233-20190427105219029-1411143347.png

3.2.3设计思路:

没遇到‘.’时遍历字符串
    遇到左符号"([{"
        进栈该左符号
    遇到左符号/*
        两个左符号都进栈
    遇到右符号")]}"
        若栈空,直接结束,并输出
        若栈不为空
            若与栈顶匹配
                出栈,继续遍历
    遇到右符号*/
        若栈空,直接结束,并输出
        若栈顶不为*,直接结束
        若栈顶为*
            出栈,再取栈顶
                若栈顶为/ 则匹配,再出栈
                若栈顶不为/,则直接结束
遍历结束
若栈不为空
    则不匹配
若栈空
    则为匹配

3.2.4错误原因分析:

1.对题目“当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束”没有达到要求。C++语法中的cin输入函数遇到空格就会结束。while循环的话,只要遇句点“.”时就会直接结束输入(即不管句点后面有没有回车都会结束)
2.我的代码将遇到/*和*/情况都单独拿出来分析,与遇到左符号、遇到右符号的代码有很多的重复的地方,但是好像也不好删减,反正整个代码显得很杂,看的很难受。而且对/*和*/的处理常常会出错。
3.这题也是PTA原题,当时我把所有题目都浏览一遍的时候,我就决定这道题不写了,因为之前已经想过很久,我并不认为我可以在考试的两个小时内写完我两天没写好的题目,就放弃。

3.2.5改进部分:

以下为正确代码?
1476233-20190427222139387-729684740.png
1476233-20190427222205080-390179859.png
1476233-20190427222303889-802659066.png
1476233-20190427222428970-1698066975.png

转载于:https://www.cnblogs.com/yhy949/p/10726724.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值