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

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

1.本周学习总结

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

2.PTA实验作业

函数题

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

2.1.2代码截图


2.1.3本题PTA提交列表说明

(直接在PTA上写题的严重后果👇)

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

    可以看出这里的Data也需要动态申请内存,S->Data=(int *)malloc (MaxSize * sizeof(int));。

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

2.2.2代码截图

2.2.3本题PTA提交列表说明

  • Q1:第一次编译错误

  • A1:
    题目给的头文件为#include <stdio.h>即为C,cout是C++的函数,需要头文件#include

  • Q2:第二个部分正确,错误的测试点是较大规模数据

  • A2:我当时觉得我自己写的蛮对的。后来注意到题目给的是循环队列,好吧,所有的Front和rear都应该是循环+1

  • Q3:输出超限!!!!!

  • A3:我居然把循环队列的队满和队空的条件记反了!!!,一般的循环队列(不是特指本题),队空的条件为:rear==front队满的条件为(rear+1)%MaxSize==front

  • Q4:我在写博客园的时候,就疯狂试探,发现如果按下图操作的话,pta仍然认为我运行超时??

  • A4:待解答。

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

2.3.1设计思路

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

2.3.2代码截图



2.3.3本题PTA提交列表说明

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

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

2.4.1设计思路

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

2.4.2代码截图



2.4.3本题PTA提交列表说明

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

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

错题3.1

题目3.11:

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

错题代码3.1.2:



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:





3.2.3设计思路:

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

3.2.4错误原因分析:

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

3.2.5改进部分:

以下为正确代码👇



posted on 2019-04-21 21:45  杨鸿漾  阅读(343)  评论(1编辑  收藏  举报

levels of contents