• 03-栈和队列


    1.学习总结


    2.PTA实验作业

    2.1 题目1:表达式转换

    2.2 设计思路

    定义俩个字符数组exp,poxtexp,exp用来存放表达式,postexp用来存放后缀表达式
    输入表达式,存入数组exp
    初始化运算符栈op
    将‘=’入栈
    从exp读取字符
    while(*exp!='/0'){
       if(*exp不是运算符){
            将数字或'.'依次存入到postexp中,并以字符“#”标志数值串结束
       else switch(Precede(op栈顶运算符){
               如果栈顶运算符优先级低,*exp入栈,继续读取下一个字符
               如果栈顶运算符为'( ',*exp为')'   '(' 退栈,继续读取下一个字符
               如果栈顶运算符优先级高,退栈运算符并将其放入postexp中
    }
    }
    若字符串exp扫描结束,将运算符栈op中除了‘=’之前的所有运算符依次出栈并存放到postexp
    控制输出格式,最后得到后缀表达式postexp
    

    2.3 代码截图

    2.4 PTA提交列表说明。

    错误一:运算数超过1位整数且有非整数出现
    1.没有考虑到小数的存在,在判断是否为运算符时,多考虑一下小数点,将它和数字一起存入输出postexp
    2.没有考虑到运算数超过一位,输出发现23,输出结果为2 3,增添了数字字符串以#结束这一操作,在输出时利用#正确输出

    错误二:只有1个数字

    改了输出,保证一个数字时输出格式也符合题意

    错误三:运算数前有正负号
    (暂时还没改出来,改的话判断是否为运算符等函数都要修改)第一个字符是+或-说明不是运算符,如果不是出现在前面,在表达式中部,负数是有括号的,将数字和正负号存入数组postexp,括号去掉,不保留

    2.1 题目2:符号配对

    2.2 设计思路

    定义顺序栈类型SqStack
    typedef struct snode
    {
    	ElemType data[Maxsize];
    	int top;//栈顶指针
    }SqStack;
    typedef SqStack *Stack;
    定义字符数组str,用来存放输入的C语言源程序,循环变量i=0
    定义栈s
    初始化栈s
    循环输入C语言语句到str
    记录字符数存入变量n
    如果输入'.'并且n=0,说明输入结束,跳出循环
    扫描str中所有字符
       如果当前字符为左括号,将其进栈,i+1
       如果当前字符为'/',下一个字符是'*',将注释符号换成'<'入栈,i+2
       如果当前字符为')'
           如果不是空栈,将栈顶元素出栈
                   如果栈顶元素是'(',则配对成功,出栈;否则说明不配对,输出NO,输出(-?
           如果是空栈,说明不配对,缺少左括号,输出NO,输出?-)
     i++,继续处理其他元素
      如果当前字符为']'
           如果不是空栈,将栈顶元素出栈
                   如果栈顶元素是'[',则配对成功,出栈;否则说明不配对,输出NO,输出[-?
           如果是空栈,说明不配对,缺少左括号,输出NO,输出?-]
     i++,继续处理其他元素
    如果当前字符为'}'
           如果不是空栈,将栈顶元素出栈
                   如果栈顶元素是'{',则配对成功,出栈;否则说明不配对,输出NO,输出{-?
           如果是空栈,说明不配对,输出NO,缺少左括号,输出?-}
     i++,继续处理其他元素
    如果当前字符为'*',下一个字符是'/'
           ++i;
           如果不是空栈,将栈顶元素出栈
                   如果栈顶元素是'<',则配对成功,出栈;否则说明不配对,输出NO,输出/*-?
           如果是空栈,说明不配对,输出NO,缺少左括号,输出?-*/   
     i++,继续处理其他元素 
    循环结束
    如果均配对输出YES
    

    2.3 代码截图






    2.4 PTA提交列表说明


    这一题我主要是卡在输出缺少项,思路很简单就是出栈栈顶元素,然后看看匹配不匹配,做出相应的输出。一开始把注释符当成一个字符来进行处理,发现好像不行,参考代码后,发现可以转化成别的字符入栈,这样对一个字符的匹配判断就容易了

    2.1 题目3:报数游戏

    2.2 设计思路

    变量n表示整队人数,m表示退出位置
    构造一个空队列q,将front和rear指针均设置为初始状态即0
    构建初始序列
    for i=1 to i=n
       q.rear=(q.rear+1)%MaxSize
        q,data[q.rear]=i
    end for
    队列不空循环
      如果队列不空
          for i=1 to i=m-1
           出队一个元素,再将刚出列的元素进队
          end for
      前m-1个元素被依次放入对尾,此时出队一个元素,即原先处于m位置的元素
    所有元素出队后,循环结束
    

    2.3 代码截图

    主要函数:

    2.4 PTA提交列表说明

    最开始是模仿书本,利用循环将位置为m的元素输出,然后出队元素再入队元素,但是输出是乱的,通过画图发现是因为出队入队错误使用把序列打乱了。应该是将m前的元素出队再入队,然后出队的元素才是原m位置的元素,错在出队入队的位置还不大习惯。

    3.截图本周题目集的PTA最后排名

    3.1 栈PTA排名

    3.2 队列PTA排名

    3.3 我的总分:2分

    4. 阅读代码






    代码功能:表达式转化为后缀表达式
    优点 1.将要处理的表达式存入数组,对数组操作比较容易判断是正负号还是运算符
    2.利用continue跳出循环进行下一次循环的特点,将括号去掉

    5. 代码Git提交记录截图




  • 相关阅读:
    Mysql实战面试题
    初探Google Guava
    Spring IOC核心源码学习
    用3句话像老太太讲清楚什么是数据库
    matlab如何读入mat型的矩阵
    工作记忆数据处理
    功能连接
    奖励学习
    格兰杰因果关系及其在医学影像数据中的应用
    GC wm
  • 原文地址:https://www.cnblogs.com/tajiyu/p/8725876.html
Copyright © 2020-2023  润新知