后缀表达式的算法和实现_第1页
后缀表达式的算法和实现_第2页
后缀表达式的算法和实现_第3页
后缀表达式的算法和实现_第4页
后缀表达式的算法和实现_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.数据结构中缀表达式转后缀表达式算法及实现栈的应用计算表达式(C+代.理论:(这部分很重要,看明白了,可以写出实现算法)表达式的表示形式有中缀、前缀和后缀3中形式。中缀表达式按操作符的优先级进行计算(后面代码实现只包括+、-、*、,小括号),即数学运算。后缀表达式中只有操作数和操作符。操作符在两个操作数之后。它的计算规则非常简单,严格按照从左到右的次序依次执行每一个操作。每遇到一个操作符,就将前面的两个数执行相应的操作。由后缀表达式计算中缀表达式原理:计算机处理后缀表达式求值问题是比较方便的,即将遇到的操作数暂存于一个操作数栈中,凡是遇到操作数,便从栈中pop出两个操作数,并将结果存于操作数栈

2、中,直到对后缀表达式中最后一个操作数处理完,最后压入栈中的数就是后最表达式的计算结果。中缀表达式转换为等价的后缀表达式中缀表达式不方便与计算机处理,通常要讲中缀表达式转换为一个与之等价的后缀表达式。等价是指两个表达式的计算顺序和计算结果完全相同。中缀表达式:0.3/(5*2+1)#的等价后缀表达式是:0.3 5 2 * 1 + /#仔细观察这两个等价的表达式可知,操作数的出现次序是相同的,但运算符的出现次序是不同的。在后缀表达式中,运算符的出现次序是实际进行操作的次序;在中追表达式中,由于受到操作符的优先级和括号的影响,操作符出现次序与实际进行操作的次序很可能是不一样的。算法描述:将中缀表达式

3、转换为等价的后缀表达式的过程要使用一个栈放“(”,具体可以按照下面的方式进行。(1)从左到右一次扫描中缀表达式的每一个字符,如果是数字字符和圆点“.”则直接将它们写入后缀表达式中。(2)如果遇到的是开括号“(”,则将它们压入一个操作符栈(不需要与栈顶操作符相比较),它表明一个新的计算层次的开始,在遇到和它匹配的闭括号“)”时,将栈中的元素弹出来并放入后缀表达式中,直到栈顶元素为“(”时,将栈顶元素“(”弹出(不需要加入后缀表达式),表明这一层括号内的操作处理完毕。(3)如果遇到的是操作符,则将该操作符和操作符栈顶元素比较: 1、当所遇到的操作符的优先级小于或等于栈顶元素的优先级时,则取出栈顶元

4、素放入后缀表式, 并弹出该栈顶元素,反复执行直到栈顶元素的优先级小于当前操作符的优先级; 2、当所遇到的操作符的优先级大于栈顶元素的优先级的时则将它压入栈中。 (4)重复上述步骤直到遇到中缀表达式的结束符标记“#”,弹出栈中的所有元素并放入后缀表达式中,转换结束。 如果有算法方描述的不清楚,敬请网友指出,本人表达能力较差,欢迎提出问题。C+ 代码描述算法:(可以识别小数点,括号,实现加减乘除四则运算,可以处理任意长度的操作数,包括小数)/ 把中缀表达式转换为后缀表达式,返回后缀表达式的长度(包括空格)void postfix(char pre ,char post,int &n)int i =

5、 0 ,j=0;Stack stack;/使用的是类模板,在下篇文章给出stack.init(); / 初始化存储操作符的栈stack.push(#); / 首先把结束标志#放入栈底while(prei!=#) if(prei=0 & prei =9)|prei =.) / 遇到数字和小数点直接写入后缀表达式 postj+ = prei; n+; else if (prei=() / 遇到“(”不用比较直接入栈 stack.push(prei); else if(prei =) / 遇到右括号将其对应左括号后的操作符(操作符栈中的)全部写入后缀表达式 while(stack.gettop()!

6、=() postj+ = stack.pop(); n+; stack.pop(); / 将“(”出栈,后缀表达式中不含小括号 else if (isoperator(prei) postj+ = ; / 用空格分开操作数( n+; while(priority(prei) =0 & str*i= 0&str*i =9) x = x * 10 + (str*i-0); (*i)+; k+; while(k!=0) x /= 10.0; k-;return x;/ 由后缀表达式字符串计算相应的中值表达式的值double postfix_value(char post)Stack stack; /

7、 操作数栈stack.init();int i=0 ;double x1,x2;while(posti !=#) if(posti =0 & posti =9) stack.push(read_number(post,&i); else if(posti = ) i+; else if (posti =+) x2 = stack.pop(); x1 = stack.pop(); stack.push(x1+x2); i+; else if (posti =-) x2 = stack.pop(); x1 = stack.pop(); stack.push(x1-x2); i+; else if (posti =*) x2 = stack.pop(); x1 = stack.pop(); stack.push(x1*x2); i+; else if (posti =/) x2 = stack.pop(); x1 = stack.pop(); stack.push(x1/x2); i+; return stack.gettop();/ main()函数void main()char pre =22/(5*2+1)#;char post100 ;cout 中缀表达式为: pre endl;int n =0; / 返回后缀表达式的长度postfix(pre,post,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论