同济大学计算机编程课件:C++ds04.ppt

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

栈 表达式求值 队列 优先级队列 栈 ( Stack ) 只允许在一端插入和删除的线性表 允许插入和删除 的一端称为栈顶 (top),另一端称 为栈底(bottom) 特点 后进先出 (LIFO) 栈的抽象数据类型 栈的数组存储表示 — 顺序栈 栈的链接存储表示 — 链式栈 链式栈无栈满问题,空间可扩充 插入与删除仅在栈顶处执行 链式栈的栈顶在链头 适合于多栈操作 表达式求值 一个表达式由操作数(亦称运算对象)、操作符 (亦称运算符) 和分界符组成。 算术表达式有三种表示: 中缀(infix)表示 <操作数> <操作符> <操作数>,如 A+B; 前缀(prefix)表示 <操作符> <操作数> <操作数>,如 +AB; 后缀(postfix)表示 <操作数> <操作数> <操作符>,如 AB+; 表达式事例 中缀表达式 a + b * ( c - d ) - e / f 后缀表达式 a b c d - * + e f / - 表达式中相邻两个操作符的计算次序为: 优先级高的先计算; 优先级相同的自左向右计算; 当使用括号时从最内层括号开始计算。 一般表达式的操作符有4种类型: 算术操作符 如双目操作符(+、-、*、/ 和%)以及单目操作符(-)。 关系操作符 包括<、<=、==、!=、>=、>。这些操作符主要用于比较。 逻辑操作符 如与(&&)、或(||)、非(!)。 括号‘(’和‘)’ 它们的作用是改变运算顺序。 通过后缀表示计算表达式值的过程 顺序扫描表达式的每一项,根据它的类型做如下相应操作: 若该项是操作数,则将其压栈; 若该项是操作符<op>,则连续从栈中退出两个操作数Y和X,形成运算指令X<op>Y,并将计算结果重新压栈。 当表达式的所有项都扫描并处理完后,栈顶存放的就是最后的计算结果。 void Calculator :: Run ( ) { char ch; double newoperand; while ( cin >> ch, ch != ‘;’ ) { switch ( ch ) { case ‘+’ : case ‘-’ : case ‘*’ : case ‘/’ : DoOperator ( ch ); break; //计算 default : cin.putback ( ch ); //将字符放回输入流 cin >> newoperand; //读操作数 S.Push( newoperand ); } } } 利用栈将中缀表示转换为后缀表示 使用栈可将表达式的中缀表示转换成它的前缀表示和后缀表示。 为了实现这种转换,需要考虑各操作符的优先级。 各个算术操作符的优先级 isp叫做栈内(in stack priority)优先数 icp叫做栈外(in coming priority)优先数。 操作符优先数相等的情况只出现在括号配对或栈底的“;”号与输入流最后的“;”号配对时。 中缀表达式转换为后缀表达式的算法 操作符栈初始化,将结束符‘;’进栈。然后读入中缀表达式字符流的首字符ch。 重复执行以下步骤,直到ch = ‘;’,同时栈顶的操作符也是‘;’,停止循环。 若ch是操作数直接输出,读入下一个字符ch。 若ch是操作符,判断ch的优先级icp和位于栈顶的操作符op的优先级isp: 若 icp (ch) > isp (op),令ch进栈,读入下一个字符ch。 若 icp (ch) < isp (op),退栈并输出。 若 icp (ch) == isp (op),退栈但不输出,若退出的是“(”号读入下一个字符ch。 算法结束,输出序列即为所需的后缀表达式。 while ( ! s.IsEmpty( ) && ch != ';' ) if ( isdigit ( ch ) ) { cout << ch; cin.Get ( ch ); } else { if ( isp ( s.GetTop( ) ) < icp ( ch ) ) { s.Push ( ch ); cin.Get ( ch ); } else if ( isp ( s.GetTop( ) ) > icp ( ch ) )

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档