【数据结构】中缀表达式转前缀表达式求值
中缀表达式转前缀表达式求值
首先将中缀表达式转换成前缀表达式
前缀表达式中,操作符在前
例如: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
【数据结构】中缀表达式转前缀表达式求值相关推荐
- 数据结构 - 拓展突破(C++实现中缀表达式转前缀表达式,中缀表达式转后缀表达式,前缀表达式求值,中缀表达式求值)
文章目录 1. C++中缀表达式转后缀表达式 2. C++中缀表达式转前缀表达式 3. C++后缀表达式求值 4. C++前缀表达式求值 1. C++中缀表达式转后缀表达式 输入中缀表达式样例: 2+ ...
- 中缀表达式转换为前缀表达式(lisp实现)
使用weight.opcode和infix_to_prefix三个函数实现中缀表达式到前缀表达式的转换. 算符优先级函数weight 首先定义函数weight,它返回一个算术运算符(可简称为算符)的优 ...
- 中缀表达式到前缀表达式和后缀表达式
1.算法思路 转化为后缀:从左到右遍历中缀表达式,遇到操作数,输出,遇到操作符,当前操作符的优先级大于栈顶操作符优先级,进栈,否则,弹出栈顶优先级大于等于当前操作符的操作符,当前操作符进栈. ...
- 后缀表达式、前缀表达式
后缀表达式和前缀表达式是什么呢? 前缀表达式:不包括括号的算术表达式,将运算符写在前面,操作数写在后面的表达式.为纪念其发明者波兰数学家Jan Lukasiewcz,也称"波兰式" ...
- 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式
文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...
- 中缀表达式To前缀表达式 (python实现)
1.名词解释 1.1 中缀表达式 普通表达式,即操作符位于操作数的中间.如''2+3*5'',''(2+3)*5''.这种表达式的特点是根据运算符的优先级不同,计算顺序不同.可以通过添加括号来改变计算 ...
- Java 计算数学表达式(字符串解析求值工具)
Java字符串转换成算术表达式计算并输出结果,通过这个工具可以直接对字符串形式的算术表达式进行运算,并且使用非常简单. 这个工具中包含两个类 Calculator 和 ArithHelper Calc ...
- 中缀表达式转为前缀表达式,然后根据前缀表达式计算结果
相关原理 理论部分请参照上面的博客,写的很清楚. 好的我们来看代码 举个栗子 (9-((1+3)*2))/2 结果是0.5 def infix_to_prefix(expression):assert ...
- leet_241_different_way_add_parenthese(给表达式加括号并求值)
leet:地址 分类:分治法(+递归) 题目描述: 给定一串由数字和操作符构成的字符串,通过对其加所有可能形式的括号,求出该字符串所有可能的取值.有效的操作符为+.-.x. 输入输出样例(注意此样例顺 ...
最新文章
- Android -- ADT变化aarLint
- spring 数据库 链接db2_Druid,Java语言中最好的数据库连接池
- struts2:JSON在struts中的应用(JSP页面中将对象转换为JSON字符串提交、JSP页面中获取后台Response返回的JSON对象)...
- ju 单元测试_【单元测试】一年级语文上册 第二单元
- RStudio 的使用
- Java中栈和队列的类
- CMake 手册详解(七)
- 加密狗厂商及工作原理介绍
- ATF(Arm Trusted Firmware)/TF-A Chapter 05 BL2
- visa虚拟卡生成器_你们要的电子虚拟信用卡,它来了,准备好盘了吗?
- 自定义封装无人值守Windows10镜像
- 苹果笔记本安装windows系统
- 一点笔记,好记性不如烂笔头
- 520情人节告白❤HTML+CSS+JavaScript实现抖音流动爱心
- 数学建模基本算法模型
- 《Android游戏编程入门经典》——1.1节Android 4简介
- Postgresql12主从配置及切换
- IDEA 中 使用 MyBatis 访问数据库时 报错 Table ‘xxx.t_xxx‘ doesn‘t exist
- ffmpeg screen-capture-recorder快速安装
- RS232/RS485/RS422 接线说明
热门文章
- python isdigit函数
- 世上本没有路,只是走的人多了就成了路 2016我的年终总结
- DotNetBar界面按钮设置
- python 图片裁剪,图片主体颜色
- 关于terra vista 6.2的一些问题交流
- 大数据开发:分布式文件存储系统简介
- python调用aspen_用Matlab与Aspen Plus通信
- java小魔女大冒险_小魔女大冒险,小魔女大冒险下载,小魔女大冒险官网,礼包,活动,图片,评测,专区,论坛 - 酷酷跑手机游戏...
- c++中的重定义,重包含。
- 计算机 节能措施,电脑出现节能模式怎么办