设以’@’字符作为结束符的中缀算术表达式已经保存在s1字符串中,转换后得到的后缀算术表达式拟存于s2字符串中。由中缀表达式转换为后缀表达式的规则可知:转换前后,表达式中的数值项的次序不变,而运算符的次序发生了变化,由处在两个运算对象的中间变为处在两个运算对象的后面,同时去掉了所有的括号。为了使转换正确,必须设定一个运算符栈,并在栈底放入一个特殊算符,假定为’@’字符,让它具有最低的运算符优先级,假定为数值0,此栈用来保存扫描中缀表达式得到的暂不能放入后缀表达式中的运算符,待它的两个运算对象都放入到后缀表达式以后,再令其出栈并写入到后缀表达式中。
    把中缀表达式转换为后缀表达式算法的基本思路是从头到尾地扫描中缀表达式中的每个字符,对于不同类型的字符按不情况进行处理。若遇到的是空格则认为是分隔符,不需要进行处理;若遇到的是数字或小数点,则直接写入到s2中,并在每个数值的最后写入一个空格;若遇到的是左括号,则应把它压入到运算符栈中,待以它开始的括号内的表达式转换完毕后再出栈;若遇到的是右括号,则表明括号内的中缀表达式已经扫描完毕,把从栈底直到保存着的对应左括号之间的运算符依次退栈并写入s2串中;若遇到的是运算符,当该运算符的优先级大于栈顶运算符的优先级(加减运算符的优先级设定为1,乘除运算符的优先级设定为2,在栈中保存的特殊运算符’@’和’(’的优先级设定为0)时,表明该运算符的后一个运算对象还没有被扫描并放入到s2串中,应把它暂存于运算符栈中,待它的后一个运算对象从s1串中读出并写入到s2串中后,再另其出栈并写入s2串中;若遇到的运算符的优先级小于等于栈顶运算符的优先级,这表明栈顶运算符的两个运算对象已经被保存到s2串中,应将栈顶运算符退栈并写入到s2串中,对于新的栈顶运算符仍继续进行比较和处理,直到被处理的运算符的优先级大于栈顶运算符的优先级为止,然后另该运算符进栈即可。
按照以上过程扫描到中缀表达式结束符’@’时,把栈中剩余的运算符依次退栈并写入到后缀表达式中,再向s2写入表达式结束符’@’和字符串结束符’{post.content}’,整个转换过程就处理完毕,在s2中就得到了转换成的后缀表达式。
    例如,设中缀算术表达式s1为:10+(18+9*3)/15-6@,使用的运算符栈用R表示,则转换过程如下:
    (1)开始时存放后缀表达式的字符串s2为空,R中压入有’@’算符,它具有最低的优先级0:
   
                   
@                   
  
(2)当扫描到s1中的左括号时,s2和R中的数据变化如下:
1 0                  
@ + (

(3)当扫描到s1中的数值3时,s2和R中的数据变化为:
1 0   1 8  9  3           
@ + ( + *

(4)当扫描到s1中的右括号时,s2和R变为:
1 0   1 8  9  3  * +        
@ +

(5)当扫描到s1中的数值15时,s2和R又变为:
1 0   1 8  9  3  * + 1 5      
@ + /

(6)当扫描到s1中的’@’字符时,s2和R为:
1 0   1 8  9  3  * + 1 5  / + 6  
@ -

1 0   1 8  9  3  * + 1 5  / + 6  - @ Ù
    (7)当整个处理过程结束后,R栈为空,s2为:

将中缀算术表达式转换为后缀算术表达式的算法描述如下:
         void Change(char* s1, char* s2)
                //  将字符串s1中的中缀表达式转换为存于字符串s2中的后缀表达式
        {
         Stack R;  //  定义用于暂存运算符的栈
            InitStack(R);  //  初始化栈
         Push(R,'@');  //  给栈底放入'@'字符,它具有最低优先级0
         int i,j;
         i=0;  //  用于指示扫描s1串中字符的位置,初值为0
         j=0;  //  用于指示s2串中待存字符的位置,初值为0
         char ch=s1[i];  //  ch保存s1串中扫描到的字符,初值为第一个字符
         while(ch!='@')
         {        //  顺序处理中缀表达式中的每个字符
          if(ch==' ')
             //  对于空格字符不做任何处理,顺序读取下一个字符
           ch=s1[++i]; 
          else if(ch=='(')
          {    //  对于左括号,直接进栈
           Push(R,ch);
           ch=s1[++i];
          }
          else if(ch==')')
          {    //  对于右括号,使括号内的仍停留在栈中的运算符依次
            //  出栈并写入到s2中
           while(Peek(R)!='(')
                        s2[j++]=Pop(R);
           Pop(R);  //  删除栈顶的左括号
           ch=s1[++i];
          }
          else if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
          {    //  对于四则运算符,使暂存在栈中的不低于ch优先级
            //  的运算符依次出栈并写入到s2中
           char w=Peek(R);
           while(Precedence(w)>=Precedence(ch))
                    {    //   Precedence(w)函数返回运算符形参的优先级
            s2[j++]=w;
            Pop(R); w=Peek(R);
         &n

转载于:https://www.cnblogs.com/grandydong/archive/2007/03/02/661852.html

中缀表达式转换为后缀表达式算法相关推荐

  1. 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现

    #!/usr/bin/env python # -*- coding: utf-8 -*-# learn <<Problem Solving with Algorithms and Dat ...

  2. java中缀表达式转后缀表达式_数据结构Java实现06----中缀表达式转换为后缀表达式...

    本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...

  3. 逆波兰表达式中缀表达式转换为后缀表达式

    中缀表达式转换为后缀表达式 思路分析 代码实现 package com.atguigu.stack;import javax.swing.plaf.nimbus.State; import java. ...

  4. 表达式计算:后缀表达式求解 以及 中缀表达式转换为后缀表达式

    后缀表达式 后缀表达式格式: 不包含括号,运算符放在两个运算对象的后面. 后缀表达式运算规则: (从左向右) 所有计算均按运算符出现的顺序(不再考虑乘除优先于加减这种运算符的优先规则),严格从左向右进 ...

  5. swust oj 1042: 中缀表达式转换为后缀表达式

    题目描述 中缀表达式是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法.后缀表达式不包含括号,运算符放在两个运算对象的后面,所 ...

  6. C语言将不固定的表达式转换为后缀表达式(附完整源码)

    将不固定的表达式转换为后缀表达式 C语言将不固定的表达式转换为后缀表达式完整源码 C语言将不固定的表达式转换为后缀表达式完整源码 #include <stdio.h> /// for pr ...

  7. 九、中缀表达式转为后缀表达式

    使用栈将中缀表达式转为后缀表达式并计算 一.中缀表达式转换为后缀表达式 由于后缀表达式适合计算式进行计算,但是人对于较长的中缀表达式,很难将中缀表达式直接转换为后缀表达式,于是我们使用栈来实现中缀表达 ...

  8. 前缀、中缀和后缀表达式详解,中缀表达式到后缀表达式的转换规则,以及后缀表达式的计算规则,附计算代码

    1. 中缀.前缀和后缀表达式 1.1 中缀表达式 首先,中缀表达式的这个"缀"指运算符在两个操作数的位置.中缀表达式其实就是我们常用的算术表达式,比如 2 + 9 - (32 * ...

  9. 【Weiss】【第03章】练习3.20:中缀表达式转后缀表达式

    [练习3.20] a.编写一个程序将中缀表达式转换为后缀表达式,该中缀表达式含括号及四则运算. b.把幂操作符添加到你的指令系统中去. c.编写一个程序将后缀表达式转化为中缀表达式. Answer: ...

  10. 学习日志-中缀表达式转后缀表达式并计算结果

    将中缀表达式转换为后缀表达式: (1)当读到数字直接送至输出队列中: (2)当读到运算符t时: a.将栈中所有优先级高于或等于t的运算符弹出,送到输出队列中: 这句话不好理解,可以说成这样,从栈顶开始 ...

最新文章

  1. Python学习笔记3——三大结构:顺序,分支,循环3
  2. python扫描端口脚本_Python实现的端口扫描功能示例
  3. 无法绑定到“ ngModel”,因为它不是“ input”的已知属性
  4. 错误: 程序包r2不存在_坚果 R2 使用体验:它是一款真旗舰,也是不一样的旗舰...
  5. win10专业版虚拟机配置服务器,虚拟机专用专业版win10 账号密码
  6. .NET高级调试 | 通过JIT拦截无侵入调试 C# Emit 生成的动态代码
  7. [css] word-wrap、word-break和white-space有什么区别?
  8. Excel太丑、敲代码太烦,这才是老板最喜欢看的神仙报表
  9. mysql中in和exists的应用场景_mysql中关于in和exists的使用
  10. python anaconda和pycharm_Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项...
  11. mysql执行语句_MySQL查看实时执行的SQL语句
  12. python降维方法_python大战机器学习——数据降维
  13. 自动驾驶 2-1 传感器和计算硬件 Sensors and Computing Hardware
  14. csdn下载频道积分规则
  15. 使用python根据图片链接下载图片
  16. QQ在线客服代码演示-asp源代码
  17. Bootstrap 栅栏系统
  18. Axure 9 修改默认字体
  19. ENIAC到EDVAC到Intel的思考
  20. 智力题、推理判断题、数量关系题(三)

热门文章

  1. springMVC文件上传的三种方法
  2. BGP消息格式-UPDATE
  3. 如何手动从Exchange2007/1010边缘/集线器传输服务器卸载ScanMail for Exchange(SMEX10.0)程序...
  4. 路由器信息备份还原指南
  5. 将Windows网络适配器共享网络的ip:192.168.137.1 改为其他IP
  6. 4月26 simulink数据input,与全局变量建立堆栈
  7. RFC 5961翻译
  8. 精简指令集(MIPS为例)常用指令特点及其格式
  9. 一个传统的前端框架的布局
  10. 手动搭建vue+node单页面(一)