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提交记录截图




原文地址:https://www.cnblogs.com/tajiyu/p/8725876.html