一、中缀表达式转后缀表达式的方法
此处偷一下懒,直接引用别人的思想总结,写的比较好哦!
中缀转后缀的三个基本方法(简单易懂)
二、实现代码
import java.util.*;
/**
* @Author 玛卡巴卡
* @Date 2020/11/7 0007 13:09
* @Dscription:使用上文链接中提到的第一个方法实现中缀表达式转后缀表达式,
* 以下是几个关键点的总结:
* 1.使用 Map 作为运算符的优先级集合;
* 2.栈 Stack<Character>st 为操作符栈,负责存放操作符以及对操作符的一些排序操作;
* 3.队列 LinkedList<Character>list 为后缀队列;
* 4.基本的代码逻辑为:
* 4.1.如果为数字,直接进队列;
* 4.2.如果栈顶元素为左括号或当前元素为左括号,直接压栈;
* 4.3.如果当前元素为右括号,进行(将栈顶元素弹出并存放到后缀队列中)的操作,一直到栈顶元素
* 为左括号时为止,并注意要将左括号也弹出;
* 4.4.如果栈顶元素的优先级小于等于当前元素的优先级,将当前元素压栈;否则,将栈顶元素
* 依次弹栈知道栈顶元素的优先级不大于当前元素的优先级为止;
* 4.5.操作完成后,将栈依次弹出入队;
*/
public class PostfixDemo {
public static void main(String[]args){
testPostFix();
}
public void testPostFix(){
postDix("12*(3+4*5)-6+8/2");
}
private void postFix(String str){
Map<Character,Integer> map = new HashMap<>();
map.put('+',1);
map.put('-',1);
map.put('*',2);
map.put('/',2);
map.put('#',0);
Stack<Character> st = new Stack<>();
LinkedList<Character> list = new LinkedList<>();
List<Character> postFix = caculatePostFix(str, map, st, list);
for (Character c :postFix)
System.out.print(c+" ");
}
private List<Character> caculatePostFix(String str, Map<Character, Integer> map, Stack<Character> st, LinkedList<Character> list) {
for(int i=0;i<str.length();i++){
char ch = str.charAt(i);
//此处是为了结果好区分,每个数字后面都会跟上逗号,这一个if操作可有可无;
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch==')'){
list.addLast(',');
}
if(ch>='0'&&ch<='9'){
list.addLast(ch);
}else if(st.isEmpty()||st.peek()=='('||ch=='('){
st.push(ch);
}else{
if(ch==')'){
while(st.peek()!= '('){
list.addLast(st.pop());
}
st.pop();
continue;
}
if(map.get(st.peek())<=map.get(ch)){
st.push(ch);
}else {
while (!st.isEmpty()&&map.get(st.peek())> map.get(ch)){
list.addLast(st.pop());
}
st.push(ch);
}
}
}
while(!st.isEmpty())
list.addLast(st.pop());
return list;
}