缀式的相互转换
1.先了解什么事是前缀式,中缀式,后缀式
定义:这三种表达式其实就是算术表达式的三种写法,以 3+4-5为例
前缀式: 操作符在操作数前面 3+(4-5) -> +3-45(没有括号就3+4-5 前缀式:+-345 这样算结果不对,百度下,还是不太清楚)(可能是同等级优先级是要加一个括号括起来呢)
中缀式: 操作符在操作数中间 3+4-5 ->平常我们所熟悉的运算表达式
后缀式: 操作符在操作数后面 34+5- ->计算机计算就是用后缀式(不唯一)
2.中缀式转换为后缀式(计算机运算实现)
3+4-5
定义两个栈:符号栈(存放操作符),数字栈(存放数字和运算结果).
符号栈:定义运算符号的优先级,这个可以设置一个int类型变量实现
+,-定义优先级最低
*,/,% 定义优先级次低
^ 定义优先级最高
中缀式转换为后缀式只要一个符号栈就可以了,数字栈是解释计算机工作原理的,
算数表达式是要String类型,String类型转换为char数组
符号栈的进栈出栈规律:1.当遍历数组的时候遇到数字字符,则直接保存
2.当遇到符号字符时:当栈空是就直接进栈;否则就判断栈顶的运算符的优先级是否小于要进栈的符号
(记住是小于,等于或是大于都不行)
3.当栈顶符号优先级大于要进栈符号,则栈顶符号出栈,出栈符号保存,当下一个栈顶符号还是
优先级大于要进栈元素,则继续栈顶出栈,保存栈顶符号,直到要进栈符号满足进栈要求进栈为止
4.当进栈符号是左括号(时直接进栈
5.当进栈符号是右括号)时,一直出栈,知道遇到符号是左括号为止,出栈符号保存,左括号出栈不保存
6.当遍历完数组的时候就出栈所有符号,保存
3+4-5+(4*1)进栈过程 -> 保存使用StringBuffer s来,符号找用f来表示
1.遍历时遇到数字直接保存
s = 3,f = 空
2.遍历时遇到符号字符+号
这时符号栈为空,直接进栈
s = 3,f = +
3.遍历时遇到数字直接保存