第四章 算术表达式求值.ppt

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章 算术表达式求值

栈的应用——算术表达式求值 表达式都是由 操作数(operand) 运算符(operator) 界限符(delimiter) 组成的。 其中操作数可以是常数,也可以是变量或常量的标识符;运算符是算术运算符( + , - , * , / );界限符为左右括号和标识表达式结束的结束 算术表达式的表示方法 1. 中缀表达式--运算符在操作数之间 如: A * B / C 运算规则: (1) 先计算括号内,后计算括号外; (2) 在无括号或同层括号内,先进行乘除运算,后进行加减运算,即乘除运算的优先级高于加减运算的优先级; (3) 同一优先级运算,从左向右依次进行。 2. 后缀表达式: 1929 年,由波兰逻辑学家(Lukasiewicz)提出。 [例] A * B / C; A B * C / ; ● 定义:运算符紧跟在两个操作数之后的表达式叫后缀 表达式。 ● 优点:① 后缀表达式没有括号 ② 不存在优先级的差别 ③ 计算过程完全按照运算符出现的先后次序 进行 中缀表达式 后缀表达式 a+b a b+ a+b*c a b c *+ a*b*c+c*d (a+b)*((c-d)*e+f) [例] 计算后缀表达式ABC*/DE*+AC*-; ● 后缀表达式求值的方法(堆栈的应用): ① 从左到右读入后缀表达式,若读到的是操作数,将它压入堆栈。 ② 若读到的是运算符,就从堆栈中连续弹出两个元素,进行相应的运算,并将结果压入栈中。 ③ 读入结束符时,栈顶元素就是计算结果。 定义五个谓词和函数 CREATS ( S ):建立一个堆栈 S; S ? x : 元素 x 进栈; x ? S : 元素 x 出栈; APPLIED(P, x , y) : 运算符 P 作用于操作数x 和 y 的结果; ISOPTOR( x ) : 若x为运算符时为真,否则为假 后缀表达式求值的ADL算法: 算法EPE ( P, n ) EPE1 [初始化] CREATS ( S ) . EPE2 [表达式求值] FOR i=1 TO n DO IF NOT ( ISOPTOR( P[ i ] )) THEN S ? P[ i ] ELSE ( y ? S . x ? S. S ? APPLIED(P[ i ], x , y) ) ▌ 3. 类 Calculator的定义 # include “ stdlib.h ” # include “ astack.h ”//包含Stack的类定义 class Calculator { private: Stack double s; void Enter( double operand ); // 将一个double型操作数压入堆栈 void GetTwoOperands (double operand1, double operand2); // 从栈顶弹出两个操作数,若栈中不足两个 元素,则输出错误信息并异常终止程序 void Compute(char op); // 调用GetTwoOperands从栈顶取两个操 作数x和y,执行运算xopy,将运算结果 压入栈 void Clear(void); // 清空操作数栈 publilc: //建立一个空计算器栈 Calculator(void){ }; //计算表达式的值 void Run(void); }; ? 4. 类 Calculator的实现 ① 将一个double型操作数压入堆栈 void Calculator :: Enter( double operand ) { s.Push(operand);} ②从栈顶弹出两个操作数 void Calculator :: GetTwoOperands ( double

文档评论(0)

a888118a + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档