举一个中缀表达式的例子:a+b-a*((c+d)/e-f)+g

一、中缀表达式转后缀表达式

方法一:括号法

比较简单方便。

①按照运算符的优先级,对所有的运算单位加括号。

于是变成:(((a+b)-(a*(((c+d)/e)-f)))+g)

②从最里面的括号开始,依次把运算符号移动到对应的括号的后面

于是变成:(((ab)+(a(((cd)+e)/f)-)*)-g)+

③最后,把括号都去掉

于是变成:ab+acd+e/f-*-g+

方法二:利用语法树

略。

方法三:基于堆栈的算法

具体转换方式:

从左到右进行遍历。

1.遇到的是运算数,直接输出。

2.遇到的是左括号'(',直接压入堆栈(括号是最高优先级,无需比较;入栈后优先级降到最低,确保其他符号正常入栈)。

3.遇到的是右括号')',意味着括号已结束。不断弹出栈顶运算符并输出,直到遇到左括号,这个左括号弹出但是不输出。

4.遇到的是运算符('+'、'-'、'*'、'/'),有三种情况

①如果栈为空,直接入栈。

②如果栈顶元素是左括号'(',直接入栈。

③如果栈顶元素是运算符,则需要进行比较,

1-如果优先级大于栈顶运算符,则压入堆栈;

2-如果优先级小于等于栈顶运算符,则将栈顶运算符弹出并输出,然后比较新的栈顶运算符,直到优先级大于栈顶运算符或者栈空,再将该运算符入栈

5.如果对象处理完毕,则按顺序弹出并输出栈中所有运算符

算法如下:

/*
中缀转后缀
思路:
中缀存于一个字符数组infix[]里,有一个辅助栈s1,栈顶元素为top1,有一个结果栈s2,栈顶元素为top2。
从左向右扫描。i=0,当infix[i]!='\0'时,
1、碰到'0'-'9',存入s2中。
2、碰到'(',存入s1中。
3、碰到'+'、'-'、'*'、'/',如果栈为空,或者top1='(',或者运算符的优先级大于top1栈顶元素的优先级,存入s1中;否则s2[++top2]=s1[top1--]。
4、碰到')',将s1里截止到'('以前的元素全部放到s2中,并把'('丢掉
*///判断运算符的优先级
int getPriority(char op){if(op=='+'||op=='-')return 0; //+或-的优先级比较低elsereturn 1;
}void infixToPostFix(char infix[], char s2[], int &top2) //infix[]是中缀表达式存在数组里,s2是结果栈
{char s1[maxSize]; int top1=-1; //s1是辅助栈int i=0;while(infix[i]!='\0'){if('0'<=infix[i]&&infix[i]<='9'){ //如果扫描到'0'-'9'字符,将它放入s2s2[++top2]==infix[i];++i;}else if(infix[i]=='('){ //如果扫描到'(',将它放入s1s1[++top1]='(';++i;}else if(infix[i]=='+'|| //如果扫描到'+','-','*','/'字符,需要和s1里的元素进行判断infix[i]=='-'||infix[i]=='*'||infix[i]=='/'){if(top1==-1|| //判断s1是否为空s1[top1]=='('|| //判断辅助栈的栈顶元素是否为'('getPriority(infix[i])>getPriority(top1[top1])){ //判断表达式里元素的优先级是否大于s1元素的优先级s1[++top1]=infix[i];++i;}else //如果不是,将辅助站的运算符放入结果栈里s2[++top2]==s1[top1--];}else if(infix[i]==')'){while(s1[top1]!='(')s2[++top2]=s1[top1--];--top1; //删除s1里的'('++i;}}while(top1!=-1)s2[++top2]=s1[top1--]; //将s1中的元素都放入s2
}

二、中缀表达式转前缀表达式

和中缀表达式转后缀表达式类似,稍微有点区别。

方法一:括号法

比较简单方便。

①按照运算符的优先级,对所有的运算单位加括号。

于是变成:(((a+b)-(a*(((c+d)/e)-f)))+g)

②从最里面的括号开始,依次把运算符号移动到对应的括号的前面

于是变成:+(-(+(ab)*(a-(/(+(cd)e)f)))g)

③最后,把括号都去掉

于是变成:+-+ab*a-/+cdefg

方法二:利用语法树

略。

方法三:基于堆栈的算法

具体转换方式:

从右到左进行遍历。

1.遇到的是运算数,直接输出。

2.遇到的是右括号')',直接压入堆栈(括号是最高优先级,无需比较;入栈后优先级降到最低,确保其他符号正常入栈)。

3.遇到的是左括号'(',意味着括号已结束。不断弹出栈顶运算符并输出,直到遇到右括号,这个右括号弹出但是不输出。

4.遇到的是运算符('+'、'-'、'*'、'/'),有三种情况

①如果栈为空,直接入栈。

②如果栈顶元素是右括号')',直接入栈。

③如果栈顶元素是运算符,则需要进行比较,

1-如果优先级大于等于栈顶运算符,则压入堆栈;

2-如果优先级小于栈顶运算符,则将栈顶运算符弹出并输出,然后比较新的栈顶运算符,直到优先级大于等于栈顶运算符或者栈空,再将该运算符入栈

5.如果对象处理完毕,则按顺序弹出并输出栈中所有运算符

算法如下:

/*
中缀转前缀
思路:
中缀存于一个字符数组infix[]里,有一个辅助栈s1,栈顶元素为top1,有一个结果栈s2,栈顶元素为top2。
从右向左扫描。i=len-1,当i>=0时,
1、碰到'0'-'9',存入s2中。
2、碰到')',存入s1中。
3、碰到'+'、'-'、'*'、'/',如果栈为空,或者top1=')',运算符的优先级大于等于top1栈顶元素的优先级,存入s1中;否则s2[++top2]=s1[top1--]。
4、碰到'(',将s1里截止到')'以前的元素全部放到s2中,并把')'丢掉
*///判断运算符的优先级
int getPriority(char op){if(op=='+'||op=='-')return 0; //+或-的优先级比较低elsereturn 1;
}void infixToPreFix(char infix[], int len, char s2[], int top2){char s1[maxSize]; int top1=-1;int i=len-1;while(i>=0){if('0'<=infix[i]&&infix[i]<='9'){s2[++top2]=infix[i];--i;}else if(infix[i]==')'){s1[++top1]=')';--i;}else if(infix[i]=='+'||infix[i]=='-'||infix[i]=='*'||infix[i]=='/'){if(top1==-1||s1[top1]==')'||getPriority(infix[i])>=getPriority(s1[top1])){s1[++top1]=infix[i];--i;}else s2[++top2]=s1[top1--];}if(infix[i]=='('){while(s1[top1]!=')')s2[++top2]=s1[top1--];--top1;--i;}}while(top1!=-1)s2[++top2]=s1[top1--];
}

中缀表达式转后缀、前缀表达式的方法相关推荐

  1. (中缀)表达式转换成前缀表达式、后缀表达式

    认识前缀.中缀.后缀表达式: 一般我们平时用的计算式都是中缀表达式,因为符号都是在操作数的中间的.相对应的符号在操作数后面的就叫后缀表达式(也称逆波兰式),符号在操作数前面的就叫前缀表达式(也称波兰式 ...

  2. pnd1 c语言,c语言实现中缀后缀前缀表达式相互转化并求值

    <c语言实现中缀后缀前缀表达式相互转化并求值>由会员分享,可在线阅读,更多相关<c语言实现中缀后缀前缀表达式相互转化并求值(21页珍藏版)>请在人人文库网上搜索. 1.1)表达 ...

  3. 中缀表达式转换成前缀表达式和后缀表达式的极其简单方法

    35,15,+,80,70,-,*,20,/ //后缀表达方式 (((35+15)*(80-70))/20)=25 //中缀表达方式 /,*,+,35,15,-,80,70, 20 //前缀表达方式 ...

  4. 中缀表达式转换成前缀表达式和后缀表达式

    35,15,+,80,70,-,*,20,/ //后缀表达方式 (((35+15)*(80-70))/20)=25 //中缀表达方式 /,*,+,35,15,-,80,70, 20 //前缀表达方式 ...

  5. 中缀表达式/后缀表达式/前缀表达式

    1:什么是中缀表达式,前缀表达式,后缀表达式? 正如我们常常潜意识认为我们所说的数字都是十进制,对于数字的其他进制感觉不正确一样,其实只是我们不熟悉而已,其他进制其实也不过就是一种对数据的表达方式而已 ...

  6. 中缀、后缀、前缀表达式

    一.简介 对于1+((2*3)-4)/2 的数学表达式怎么求值? 分析: 数学表达式求值有优先级,不能简单的从左往右依次计算, 需要从优先级高的开始计算 中缀表达式是一种通用的算术或逻辑公式表示方法, ...

  7. 前缀表达式中缀表达式后缀表达式之间的转换JAVA代码实现

    一.前缀表达式 (1)中缀表达式转前缀表达式 (2)前缀表达式的计算 二.后缀表达式 (1)中缀表达式转后缀表达式 (2)后缀表达式的计算 三.中缀表达式直接计算 四.总结 代码实现的工具类Expre ...

  8. 前缀表达式、中缀表达式、后缀表达式的区别

    一.三者的概念(参考维基百科) 1.1中缀表达式 中缀表达式是符合人类直觉的一种表达方式,其特点是操作符(二元操作符)在中间,操作数在两侧. 例如 3 + 4 ,   5 - 6 * 7,     ( ...

  9. 前缀表达式、中缀表达式、后缀表达式

    前.中.后这三个方位名词是运算符相对于操作数的位置而言的: 如果是前缀运算符的话 那么就是运算符在操作数前面 如果是中缀运算符的话 那么就是运算符在操作数中间 如果是后缀运算符的话 那么就是运算符在操 ...

  10. 前缀表达式计算、中缀表达式计算、后缀表达式计算

    首先要知道什么是前缀表达式,什么是中缀表达式,什么是后缀表达式 所谓的中缀表达式就是类似于这种的运算 1+((2+3)×4)-5 所谓的前缀表达式就是符号在两个操作数的前面 - + 1 × + 2 3 ...

最新文章

  1. KernelIoControl和OEMIoControl的分析和使用(作者:wogoyixikexie@gliet)
  2. Pyhton 随机数的使用
  3. 程序员修炼之道:从小工到专家读后感02
  4. [图神经网络] 图节点Node表示---GAT
  5. drools 决策表_骆驼和春天的Drools决策表
  6. 6 PP配置-生产主数据-工作中心相关-工作中心标准值参数
  7. CF962E Byteland, Berland and Disputed Cities
  8. python thread.event
  9. [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)...
  10. JavaScript 入门·JavaScript 具有全范围的运算符
  11. 明略数据是谁?为何能拿下腾讯在行业AI的高额投资
  12. 《Ray Tracing in One Weekend》——Chapter 2: The vec3 class
  13. 笔记本电脑win10打开照相机显示灰色相机解决办法
  14. Lowe的SIFT(尺度不变特征变换)程序使用详细说明
  15. QLabel 添加下划线 删除线
  16. 2017年囧事大全,全部真人真事
  17. 输出所有3位数的水仙花数,例:153=1的3次方+5的3次方+3的3次方 谭浩强《c语言程序设计》第五章第八题
  18. 微信小程序-组件样式覆盖
  19. Firefox OS应用程序入门
  20. 从程序员到asp.net架构师转变

热门文章

  1. 一次简单的计网实践——浅谈校园网认证原理、ipv6机制绕过认证限制、双路由器宿舍组网
  2. 怎么投小红书kol?在小红书中投放kol需要了解什么?
  3. 人工智能学习(十):什么是贝叶斯网络——伯克利版
  4. android 测试屏幕触点,如何检测Android Studio中的后台服务是否触摸了屏幕?
  5. 褥羊毛,终于攒够了付费文章的简书钻
  6. 获取申请APPKey所需的SHA1
  7. 计算hash值的方法
  8. 网络爬虫学习网络资源链接汇总
  9. matlab不定方程,Maple或Matlab怎么解不定方程?
  10. 怎样恢复出厂设置并还原Apple Silicon M1 Mac?