知识大全 数据结构考研分类复习真题 第三章 答案[18]
Posted 表达式
篇首语:别裁伪体亲风雅,转益多师是汝师。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 数据结构考研分类复习真题 第三章 答案[18]相关的知识,希望对你有一定的参考价值。
[题目分析]逆波兰表达式(即后缀表达式)求值规则如下 设立运算数栈OPND 对表达式从左到右扫描(读入) 当表达式中扫描到数时 压入OPND栈 当扫描到运算符时 从OPND退出两个数 进行相应运算 结果再压入OPND栈 这个过程一直进行到读出表达式结束符$ 这时OPND栈中只有一个数 就是结果
float expr( ) //从键盘输入逆波兰表达式 以 $ 表示输入结束 本算法求逆波兰式表达式的值 {float OPND[ ]; // OPND是操作数栈 init(OPND); //两栈初始化 float num= ; //数字初始化 scanf ( %c &x);//x是字符型变量 while(x!= $ ) switch case <=x<= :while((x>= &&x<= )||x== ) //拼数 if(x!= ) //处理整数 num=num* +(ord(x) ord( )); scanf( %c &x); else //处理小数部分 scale= ; scanf( %c &x); while(x>= &&x<= ) num=num+(ord(x) ord( )/scale; scale=scale* ; scanf( %c &x); //else push(OPND num); num= ;//数压入栈 下个数初始化 case x= :break; //遇空格 继续读下一个字符 case x= + :push(OPND pop(OPND)+pop(OPND));break; case x= :x =pop(OPND);x =pop(OPND);push(OPND x x );break; case x= * :push(OPND pop(OPND)*pop(OPND));break; case x= / :x =pop(OPND);x =pop(OPND);push(OPND x /x );break; default: //其它符号不作处理 //结束switch scanf( %c &x);//读入表达式中下一个字符 //结束while(x!= $ ) printf( 后缀表达式的值为%f pop(OPND)); //算法结束
[算法讨论]假设输入的后缀表达式是正确的 未作错误检查 算法中拼数部分是核心 若遇到大于等于 且小于等于 的字符 认为是数 这种字符的序号减去字符 的序号得出数 对于整数 每读入一个数字字符 前面得到的部分数要乘上 再加新读入的数得到新的部分数 当读到小数点 认为数的整数部分已完 要接着处理小数部分 小数部分的数要除以 (或 的幂数)变成十分位 百分位 千分位数等等 与前面部分数相加 在拼数过程中 若遇非数字字符 表示数已拼完 将数压入栈中 并且将变量num恢复为 准备下一个数 这时对新读入的字符进入 + * / 及空格的判断 因此在结束处理数字字符的case后 不能加入break语句
cha138/Article/program/sjjg/201311/22705相关参考
第三章 栈和队列答案 一选择题 BBABDCBDDCDBDDDCBCBDBBBDDDDCAADBBDCBCBACCFCCAAD 二判断题 √√√√×√√√√×√×××√×√×√√
见上题的解答 参见上面题 typedefstructnode elemtypeelemcq[m]; //m为队列最大可能的容量 intfrontrear;
typedefstruct elemtpq[m]; intfrontcount; //front是队首指针count是队列中元素个数 cqnode; &nbs
[题目分析]本题与上面题基本相同现用类C语言给出该双端队列的定义 #definemaxsize typedefstruct datatypeelem[maxsize]; int
#definemaxsize栈空间容量 voidInOutS(ints[maxsize]) //s是元素为整数的栈本算法进行入栈和退栈操作 inttop=;  
s=(LinkedList)malloc(sizeof(LNode))s>data=x;s>next=r>nextr>next=sr=s 牺牲一个存储单元 &n
既不能由输入受限的双端队列得到也不能由输出受限的双端队列得到的输出序列是dbca () () &nbs
本题与上题本质上相同现用类C语言编写入队和出队算法 ()voidEnQueue(LinkedListrearElemTypex) //rear是带头结点的循环链队列的尾指针本算法将元素x插入到
intMaxValue(inta[]intn)//设整数序列存于数组a中共有n个本算法求解其最大值 if(n==)max=a[]; elseifa[n]>MaxValue(an)max=
[题目分析]这是以读入数据的顺序为相反顺序进行累乘问题可将读入数据放入栈中到输入结束将栈中数据退出进行累乘累乘的初值为 PROC test; CONSTmaxsize=; VARs