逆波兰表达式–四则运算
闲话少叙,直接开始正题.
- 什么是逆波兰表达式
* 逆波兰表达式就是后缀表达式,平时进行运算的时候我们通常使用的都是中缀表达式(1+2,2+3),如果将其转换为后缀表达式则为(1 2+,2 3 +) - 为什么要将中缀表达式转换为后缀表达式,中缀表达式不香么
* 因为在利用变成语言计算的时候,计算机并不能对运算符的优先级很好的处理,更不用说各种括号了其实是因为会tm考啊
![](https://i-blog.csdnimg.cn/blog_migrate/9cfa3545ef2a3e3d83f17086dd530add.jpeg)
首先,我们要处理一下我们拿到的字符串,这里我们拿到的字符串是这个样子的
3+2*{1+2*[-4/(8-6)+7]}
这里我们直接将字符串存到ArrayList中方便后续转后缀表达式
- 首先我们要对这串数字进行遍历,将它们放到list中,其中要注意对多位数的处理,需要进行一个判断,当它是一个数字的时候就进行一个字符串的拼接.
public static List<String> zhuanhuan(String str){
char[] ch = str.toCharArray();//分隔字符
List<String> list = new ArrayList<String>();//用来存放数据
String s = "";//用于字符串的拼接
int pom = 0;//定义一个指针
while (pom < str.length()){
//判断,当目标为数字的时候
if (Character.isDigit(ch[pom])){
s="";
//循环判断当数字的时候进行一个字符串的拼接
while (pom < str.length()&&Character.isDigit(ch[pom])){
s += ch[pom];
pom++;
}
list.add(s);
}else {
list.add(""+ch[pom]);
pom++;
}
}
return list;
}
这样我们就得到了下面的一串数字
[3, +, 2, *, {, 1, +, 2, *, [, -, 4, /, (, 8, -, 6, ), +, 7, ], }]
现在我们要对这个保存的数字进行一下处理,让它成为我们想要的样子特指后缀表达式
如果我们想要一个后缀表达式,就需要对后缀表达式的转换规则有所熟悉.
-
首先我们需要一个栈来存放操作符,需要一个list来存放数据.好在java中上帝给你提供了栈Stack(后进先出),你只需要new一个新的就可以了.
没有对象老子还不能new一个么
-
当遍历到数字的时候直接进入到list中.
-
当遇到"("的时候直接压栈
-
当遍历到操作符的时候需要进行判断
- 当栈内为空,或者当前操作符的优先级大于栈顶操作符的时候直接压栈
- 当栈内不为空并且当前操作符小于等于栈顶操作符的时候循环弹出栈内操作符将其加入到list中,并将当前操作符入栈(注"(“没有遇到”)"时不动)
-
当遇到")“时,循环弹出栈内操作符并将其加入到list中,直到遇到”(",并且"("不入list,直接弹出
-
当表达式为空是将栈内剩余元素弹出并加入到list中
好的,现在我们了解了规则之后开始将处理好的list转换为后缀表达式再放入到list中并返回
public static List<String> Houzhui(List<String> str){
Stack<String> stack = new Stack<>();//符号栈
List<String> list = new ArrayList<>();//表达式存放
Map<String, Integer>map = new