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

首先将中缀表达式转换成前缀表达式
前缀表达式中,操作符在前
例如: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. Android -- ADT变化aarLint
  2. spring 数据库 链接db2_Druid,Java语言中最好的数据库连接池
  3. struts2:JSON在struts中的应用(JSP页面中将对象转换为JSON字符串提交、JSP页面中获取后台Response返回的JSON对象)...
  4. ju 单元测试_【单元测试】一年级语文上册 第二单元
  5. RStudio 的使用
  6. Java中栈和队列的类
  7. CMake 手册详解(七)
  8. 加密狗厂商及工作原理介绍
  9. ATF(Arm Trusted Firmware)/TF-A Chapter 05 BL2
  10. visa虚拟卡生成器_你们要的电子虚拟信用卡,它来了,准备好盘了吗?
  11. 自定义封装无人值守Windows10镜像
  12. 苹果笔记本安装windows系统
  13. 一点笔记,好记性不如烂笔头
  14. 520情人节告白❤HTML+CSS+JavaScript实现抖音流动爱心
  15. 数学建模基本算法模型
  16. 《Android游戏编程入门经典》——1.1节Android 4简介
  17. Postgresql12主从配置及切换
  18. IDEA 中 使用 MyBatis 访问数据库时 报错 Table ‘xxx.t_xxx‘ doesn‘t exist
  19. ffmpeg screen-capture-recorder快速安装
  20. RS232/RS485/RS422 接线说明

热门文章

  1. python isdigit函数
  2. 世上本没有路,只是走的人多了就成了路 2016我的年终总结
  3. DotNetBar界面按钮设置
  4. python 图片裁剪,图片主体颜色
  5. 关于terra vista 6.2的一些问题交流
  6. 大数据开发:分布式文件存储系统简介
  7. python调用aspen_用Matlab与Aspen Plus通信
  8. java小魔女大冒险_小魔女大冒险,小魔女大冒险下载,小魔女大冒险官网,礼包,活动,图片,评测,专区,论坛 - 酷酷跑手机游戏...
  9. c++中的重定义,重包含。
  10. 计算机 节能措施,电脑出现节能模式怎么办