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

    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容器,可以对数据进行自动排序,也比较方便,时间复杂度更低些。
  • 相关阅读:
    poj 1113 Wall 凸包的应用
    NYOJ 78 圈水池 (入门级凸包)
    Monotone Chain Convex Hull(单调链凸包)
    poj Sudoku(数独) DFS
    poj 3009 Curling 2.0(dfs)
    poj 3083 Children of the Candy Corn
    Python join()方法
    通过FISH和下一代测序检测肺腺癌ALK基因融合比较
    华大病原微生物检测
    NGS检测ALK融合大起底--转载
  • 原文地址:https://www.cnblogs.com/salcious/p/10747191.html
Copyright © 2011-2022 走看看