中缀表达式转前缀表达式求值

首先将中缀表达式转换成前缀表达式
前缀表达式中,操作符在前
例如:1+2*(5-3)+4
后缀表达式:++1*2-534

一、转换思路

转换思路为将输入的中缀表达式字符串从右往左扫描(字符前后加#号),遇到数字直接输出,遇到操作符比较优先级。
栈顶优先级低,入栈;
栈顶优先级高,出栈并且输出;
优先级相等(即左右括号),出栈(不输出);
当扫描的字符为#并且栈顶字符为#时,此时将输出的字符序列反转即为前缀表达式。
注意:优先级顺序表与求中缀表达式和后缀表达式的优先级顺序表不同

二、前缀表达式求值过程

将转换成的前缀表达式的字符串从右往左扫描,扫描到数字时进栈,扫描到字符从栈中出两个数字,然后与扫描到的字符之间进行运算, <运算时注意:先出栈的做运算符的前操作数,后出栈的做后操作数> 这与后缀、前缀表达式求值恰好相反。当全部扫描完后,栈顶的元素即为运算结果。

前缀表达式求值优先级:

该优先级表与中缀和后缀表达式求值区别主要有:相同操作符(+ - * /)栈顶优先级低;预比较运算符 ) 优先级最高,( 最低栈顶 )、 预比较 ( 相等

三、代码展示

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;string s;  //中缀表达式字符串
string s1="\0"; //后缀表达式字符串
char OPTR[100]; //操作符栈
char OPND[100]; //操作数栈
int topN=-1,topT=-1;//栈的基本操作
void push(char *OPTR,char ch){OPTR[++topT]=ch;
}
void push(int *OPND,int val){OPND[++topN]=val;
}
char pop(char *OPTR){return OPTR[topT--];
}
int pop(int *OPND){return OPND[topN--];
}
int getTop(int *OPND){return OPND[topN];
}
char getTop(char *OPTR){return OPTR[topT];
}//定义一个二位字符数组存放优先级表// +   -    *   /   (   )   #char arr[7][7]={'<','<','<','<','>','<','>','<','<','<','<','>','<','>','>','>','<','<','>','<','>','>','>','>','<','>','<','>','>','>','>','>','<','\0','>','<','<','<','<','=','<','\0','<','<','<','<','\0','<','='};
//定义字符表
int opCH(char ch){int i;switch(ch){case '+':{i=0;break;}case '-':{i=1;break;}case '*':{i=2;break;}case '/':{i=3;break;}case '(':{i=4;break;}case ')':{i=5;break;}case '#':{i=6;break;}}return i;
}
//比较运算符的优先级
char percede(char ch1,char ch2){int i,j;i=opCH(ch1);j=opCH(ch2);return arr[i][j];
}int operate(int a,char theta,int b){switch(theta){case '+':{return a+b;}case '-':{return a-b;}case '*':{return a*b;}case '/':{return a/b;}}return 0;}
void suffix(string s){//将字符串反转 然后在字符串最后加一个#标志符reverse(s.begin(),s.end());s+="#";for(int i=0;s[i]!='#'||getTop(OPTR)!='#';i++){if(s[i]>48&&s[i]<58){s1+=s[i];  //如果是数字的话放入新字符串}else if(s[i]=='*'||s[i]=='/'||s[i]=='+'||s[i]=='-'||s[i]=='('||s[i]==')'||s[i]=='#'){switch(percede(getTop(OPTR),s[i])){case '>':{s1+=pop(OPTR);//栈顶优先级高的话放入新字符串i--;break;}case '<':{push(OPTR,s[i]);break;}case '=':{if(s[i]=='('){pop(OPTR);}}}}}
}int calculation(string s1){int a,b,c;char theta;reverse(s1.begin(),s1.end());for(int i=0;s1[i]!='\0';i++){if(s1[i]>48&&s1[i]<58){c=s1[i]-48;push(OPND,c);}else if(s1[i]=='*'||s1[i]=='/'||s1[i]=='+'||s1[i]=='-'){a=pop(OPND);b=pop(OPND);theta=s1[i];push(OPND,operate(a,theta,b));}}return getTop(OPND);
}
int main(){push(OPTR,'#');
cout<<"请输入中缀表达式:";
cin>>s;
suffix(s);cout<<"前缀表达式:"; //反转字符串reverse(s1.begin(),s1.end());cout<<s1<<endl;cout<<"表达式结果:";cout<<calculation(s1)<<endl;return 0;
}

四、结果展示


五、局限

局限输入、中间或者结果值只能在0-9范围内,因为ASCII码转数字的问题只能是0-9

【数据结构】中缀表达式转前缀表达式求值相关推荐

  1. 数据结构 - 拓展突破(C++实现中缀表达式转前缀表达式,中缀表达式转后缀表达式,前缀表达式求值,中缀表达式求值)

    文章目录 1. C++中缀表达式转后缀表达式 2. C++中缀表达式转前缀表达式 3. C++后缀表达式求值 4. C++前缀表达式求值 1. C++中缀表达式转后缀表达式 输入中缀表达式样例: 2+ ...

  2. 中缀表达式转换为前缀表达式(lisp实现)

    使用weight.opcode和infix_to_prefix三个函数实现中缀表达式到前缀表达式的转换. 算符优先级函数weight 首先定义函数weight,它返回一个算术运算符(可简称为算符)的优 ...

  3. 中缀表达式到前缀表达式和后缀表达式

    1.算法思路 转化为后缀:从左到右遍历中缀表达式,遇到操作数,输出,遇到操作符,当前操作符的优先级大于栈顶操作符优先级,进栈,否则,弹出栈顶优先级大于等于当前操作符的操作符,当前操作符进栈.     ...

  4. 后缀表达式、前缀表达式

    后缀表达式和前缀表达式是什么呢? 前缀表达式:不包括括号的算术表达式,将运算符写在前面,操作数写在后面的表达式.为纪念其发明者波兰数学家Jan Lukasiewcz,也称"波兰式" ...

  5. 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式

    文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...

  6. 中缀表达式To前缀表达式 (python实现)

    1.名词解释 1.1 中缀表达式 普通表达式,即操作符位于操作数的中间.如''2+3*5'',''(2+3)*5''.这种表达式的特点是根据运算符的优先级不同,计算顺序不同.可以通过添加括号来改变计算 ...

  7. Java 计算数学表达式(字符串解析求值工具)

    Java字符串转换成算术表达式计算并输出结果,通过这个工具可以直接对字符串形式的算术表达式进行运算,并且使用非常简单. 这个工具中包含两个类 Calculator 和 ArithHelper Calc ...

  8. 中缀表达式转为前缀表达式,然后根据前缀表达式计算结果

    相关原理 理论部分请参照上面的博客,写的很清楚. 好的我们来看代码 举个栗子 (9-((1+3)*2))/2 结果是0.5 def infix_to_prefix(expression):assert ...

  9. leet_241_different_way_add_parenthese(给表达式加括号并求值)

    leet:地址 分类:分治法(+递归) 题目描述: 给定一串由数字和操作符构成的字符串,通过对其加所有可能形式的括号,求出该字符串所有可能的取值.有效的操作符为+.-.x. 输入输出样例(注意此样例顺 ...

最新文章

  1. 18岁辍学,22岁进谷歌和Jeff Dean谈笑风生,这样的我究竟需不需要本科文凭?
  2. 移动端布局规范-固定页头页尾-中间随高度滑动
  3. 隐藏头视图即隐藏UINavigationBar
  4. 编程打开Windows服务控制管理器
  5. java try finally connectoin close_Java SocketChannel類代碼示例
  6. javaWeb服务详解(含源代码,测试通过,注释) ——web.xml
  7. 【BZOJ4262】Sum 单调栈+线段树
  8. 2560介绍_炒股高手收益翻10倍,只因妙用这一招2560战法,看了都不亏了
  9. python 每天执行一次_python 定时器每天就执行一次的实现代码
  10. 面试中有这些特征的公司可以pass了
  11. 分享,用sql快速创建MODEL,快速提高工作效率哦
  12. cookielib和urllib2模块相结合模拟网站登录
  13. ../bin/testCurveFitting 出现的错误以及解决办法
  14. 三菱q系列plc连接电脑步骤_三菱plc连接电脑步骤
  15. Eviews的基本使用,简单线性回归分析
  16. android studio项目同步失败,java - 在android studio 3.2中Gradle项目同步失败 - 堆栈内存溢出...
  17. 每日单词20110501
  18. 廉颇老矣?尚能饭否?64岁的Python之父被微软录取!
  19. 德鲁克的时间管理法—《可以量化的…
  20. linux进程cpu时间片,Linux性能监控之CPU篇

热门文章

  1. 广西省钦州市谷歌卫星地图下载
  2. 这两天眉毛一直在跳动,连带着脑袋也开始噗通噗通的,好痛啊!这是什么神经失调了?...
  3. 达梦数据库如何对模式赋予权限
  4. 图形API学习工程(28):实现基于Cook-Torrance与GGX的PBR渲染
  5. AIX查看CPU和内存参数
  6. 手撸一个动态数据源的Starter 完整编写一个Starter及融合项目的过程 保姆级教程
  7. <artifactId>spring-boot-maven-plugin</artifactId>报错
  8. 【Web】CSS(No.32)Css页面布局经典案例(二)《云道商城首页》
  9. 去除txt文件中的空行
  10. 【Multisim】7位抢答器逻辑电路仿真