实验报告表达式求值.pdfVIP

  • 53
  • 0
  • 约6.96千字
  • 约 6页
  • 2022-10-17 发布于北京
  • 举报
实验 数学系 2012 级 日期2013.04.06 No. P 评分 实验题目:表达式求值 实验目的: 使用栈和队列实现算术表达式的求值,深入了解栈和队列的特性, 以便在解决实际问题中灵活运用它们,同时加深对这两种结构的理解和认识。 实验分析:人们在书写表达式时通常将运算符放在两个操作数中间,为中缀表达 式,如:8+5* (7-3 )。但这种表示形式不适合计算机处理。将运算符放在两个操 作数后面的表达式为后缀表达式,如把前面的中缀表达式 8+5* (7-3 )写成后缀 式为 8573-*+。要计算后缀表达式,可从左到右进行扫描,查找其中的运算符。 扫描到第一个运算符 “- ”,执行“7-3 ”,并用运算结果4 代替原表达式中的 “73- ”, 表达式变成 “854*+ ”;继续扫描,到运算符“* ”,执行“5*4 ”,并用运算结果 20 代替 “54* ”,表达式变成“820+ ”;继续扫描,到运算符“+ ”,执行“8+ 20 ”, 得运算结果 28;其后扫描不到 的运算符,于是运算结束,得最终结果为28。 这种计算方法简单方便,更适合计算机的处理方式。因此,要用计算机来处理算 术表达式计算问题,首先需要将中缀表达式转化为后缀表达式。 算法分析: (1)中缀表达式到后缀表达式的转换 新扫描到运算符的优先级必须与前一个运算符的优先级做比较,如果新的运算符 优先级高,就要保存至扫描到第二个操作数并将它输出后才能将该运算符输出。 因此转化中须保存两个运算符,后保存的运算符先输出,在计算机中需要用到“后进 先出”的栈。如果表达式中含小括号,则货号 产生了独立的子表达式,当扫 描到左括号式,需要将其压入栈底使其在栈中产生一个伪栈底,当扫描到右括号 时,将从栈顶到这个伪栈底间的运算符全部弹出,将伪栈底删除。 综上所述,转换表达式的 如下: 顺序扫描中缀表达式,读到数字时直接将其送至输出队列中;读到运算符时,将 栈中所有优先级不低于该运算符的运算符弹出,送至输出队列中,再将当前运算 符入栈;读到左括号时左括号入栈;读到右括号时将靠近栈顶的第一个左括号上 面的运算符全部依次弹出,送至输出队列中,再删除栈中的左括号。 求运算符优先级函数: Priority(char op){ switch(op){ case(: case#:return(0); case-: case+:return(1); case*: case/:return(2); } } 表达式转换函数: void CT tExp(Se ueue *Q){ SeqStack OS; char c,t; SeqStack *S; S=OS;InitStack(S); Push(S,#); do{ c=getchar( ); switch(c){ case :break; case0: case1: case2: case3: case4: case5: case6: case7: case8: case9: EnQueue(Q,c);break; case(:Push(S,c);break; case): case#: do{ t=Pop(S); if(t!=(t!=#) EnQueue(Q,t); }while(t!=

文档评论(0)

1亿VIP精品文档

相关文档