1.本周学习总结

栈和队列又是一种新的数据存储模式。栈:逆序输出;队列:正序输出。两个东西从概念上相对比较好理解。起初学习,是通过数组的方式存储数据。这个时候可以通过画图列表协助理解。接着后学习了用链表的方式存储数据,通过调用c++库函数,更简洁地完成程序功能。我们可以通过栈或队列,完成表达式转换,符号配对,迷宫等需要存储后在逆序或正序输出的程序功能。在输出或输入的过程当中,应该考虑栈空栈满队空队满的情况(当然链表不会满的当我没说),防止程序出错,越界。在数组类以及循环队列中对于指针的下标,要尤其慎重。在完成pta题集的时候出现的问题较少(大概是c++库太好用了的原因吧……)上机考的时候就进入自闭模式 这个故事告诉我们不仅要会用库还要自己会写qaq(GetOp()函数省略了,脑袋卡带也写不出来来着,调试也没法调试,就放弃做题辽)所以上机的时候对于这种类型的函数能不能不要省略了qaq。平常也能翻翻书啥的。栈和队列的使用途径有很多,在接下来树的学习中更发挥了重要作用(现在讲巩固也没啥用),就在树的学习中共同进步吧!


2.PTA实验作业


2.1.题目1:6-11 另类循环队列

如果用一个循环数组表示队列,并且只设队列头指针Front,不设尾指针Rear,而是另设Count记录队列中元素个数。请编写算法实现队列的入队和出队操作。

2.1.1设计思路

  • 本题为函数题。

2.1.2代码截图

2.1.3本题PTA提交列表说明。

  • 以上为pta提交列表,此题为上机考原题故结合上机考的提交列表一同分析。

  • 以上为上机考的提交列表,因为GetOp的函数没写来着所以处于一个无法调试的盲目瞎提交的自闭状态。

  • 错误原因有2

    • 一开始莫名奇妙把队列和栈放在一块给搞混淆了,所以输出肯定就错了(当然这块还是属于盲目瞎猜的状态,考的过程当中非常自闭),不过主要问题还是数量关系上没搞清楚。
    • 对比了一下错误代码和正确代码,主要的错误在于——动了front,导致对头一直在移动,其实下标的移动可以直接用count的变化表示,在删除的时候再对front操作(迷之操作front一直动规律一直找不对)。

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

本题要求在一个数组中实现两个堆栈。注意:如果堆栈已满,Push函数必须输出“Stack Full”并且返回false;如果某堆栈是空的,则Pop函数必须输出“Stack Tag Empty”(其中Tag是该堆栈的编号),并且返回ERROR。

2.2.1设计思路

  • 本题为函数题。

2.2.2代码截图

2.2.3本题PTA提交列表说明。

  • 写完之后发现输出超限,仔细看了之后发现在判断栈空的条件上写错辽(==写成了!=),因此输出超限。
  • 输出错误的话是在输出格式上的错误qaq——printf中的tag应是变量值,不能直接输出tag名称,应该是相应的数字。

2.3 题目3:7-4 表达式转换(栈)

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

2.3.1设计思路

  • 首先读入字符串,再定义一个栈对符号顺序进行处理。如果是数字,则直接加到表达式exp中,如果是符号则通过栈进行优先级的判断,+-的优先级较低,*/较高,(最高酱。将优先级较高的符号先加到表达式当中。注意这里需要对负数进行特殊处理——
  • 负数的可能情况有两种
    • 当负号出现在表达式的第一个位置如 -5+3,此时为负数,这里将-号和数字一同加到表达式当中
    • 当负号紧接着括号出现,如1+(-5),此时也为负数,操作如上。
  • 注意 加到表达式的操作,还需要加入空格,最后将表达式输出。

2.3.2代码截图




2.3.3提交列表以及错误原因分析

  • 这道题是栈的运用的非常经典的题型,之前在mooc上就是对中缀表达式转后缀表达式进行了一个例题分析,所以整道题的思路还是比较直接,主要是对负数的处理上比较麻烦一些,在输出表达式的时候,还要在数数之间加上空格,当然这里用了string相关函数,使程序操作也简单了一些。

2.4 题目4:7-6 银行业务队列简单模拟(队列)

设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。

2.4.1设计思路

  • 定义两个队列A,B。分别存放两组用户。因为A的处理速度为B的两倍,因此A连续出列,后B出列。注意判断队列是否为空(对空队处理会出错),当其中一个队列为空时,要将未空的队列直接输出。

2.4.2代码截图

2.4.3本题PTA提交列表说明。

  • Q: 看不懂题目的输出样例,认为题目时BBABBA的输出。
  • A: 对题目的奇偶数的定义上出现问题,题目指的时输入的数字奇偶,而我认为的时队列的下标的奇偶,因此出现逻辑上的错误。更正后即可。

3、栈和队列上机考试

插入一段本次上机考试的感受与体会:本次上机考就没写两道题qaq……一开始看到报数顺溜的就写完辽,然后开始写函数一二题,程序不完整也没法编译调试来着,所以就处于很自闭的盲猜阶段,猜了一个多小时才发现错……栈和队列都搞反辽。然后中途自暴自弃放弃了考试。这个是非常不合理的qaq!!!归根结底还是对于代码不能够娴熟的掌握吧。因此真要说错题也没有错题……一下就是对没做的题的一个分析叭,顺便警示一下自己,要熟练代码,考试的时候要懂得放弃qaq。

3.1.1 题目:7-3 符号配对

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

3.1.2 代码截图




3.1.3 错误原因与体会

  • Reason:这道题在pta上是完成的,当时上机考的时候则是直接把这道题丢掉了来着(一开始就告诉自己如果是考比较简单的那题符号配对就写,麻烦的就不写,再加上被getop搞自闭了就直接自我放逐了,这道题对于/*符号要进行特殊处理,利用string函数,将俩字节的符号丢在一块判断,这一块特殊处理,然后就和符号配对异曲同工辽。
  • Experience:题目的基本思路都应该是一致的,不应该因为题目的难易麻烦程度而选题,这样会导致题目的掌握上出现比较大的漏洞。上机考的时候也不要自闭……容易全盘崩。对于比较麻烦的题目可以按照简单的框架写起,再对特殊情况特殊处理。

3.2.1 题目:列车调度

两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?

3.2.2 代码截图

3.2.3 错误原因与体会

  • 这道题从题意上还是比较难看懂的(我看不太懂来着)于是参考百度上的代码和思路辽。找的是最简洁的一款代码qwq。索性跟着这串代码学习一下set。首先这个代码有个万能头,在devc上是可以用的,vs上识别不了,如果是用devc的小伙伴可以抱走万能头,比自己写一堆的头文件方便多辽。

lower_bound(数组首地址a,数组尾地址a+n,要查找的数x) 返回的是比x大,或相等的第一个数的地址 ,根据英文本意,可以理解为从查找的位置开始,每一个比x小的都会跳过,直到找到不比x小的数为止。若找不到,返回数组位地址a+n

  • 主体思路是,每个栈道保存一下最小值。然后对于队列中的新值,我们先找到第一个比它大的值,然后删掉。插入它。利用set容器,可以对数据进行自动排序,也比较方便,时间复杂度更低些。
posted on 2019-04-21 21:44  Salcious  阅读(423)  评论(0编辑  收藏  举报