1、需要两个栈(结果String栈s1和Character辅助栈s2)
2、定义优先级( + - * / 优先级分别0 1 1 2 2
3、遍历字符串s‘
1、如果是数字,加入s1;
否则:
2、if 如果s2为空
或者是左括号“(”
或者 如果当前字符优先级大于栈顶优先级 ;
//(可类比记忆,当栈顶为左括号的时候,肯定加入,加入的优先级肯定高于栈顶){
当前字符入栈s2
}
else if 不然是右括号‘)’的话,不断while循环把栈里面‘(’之后的全部加入到s1;(括号不用加入){
while (st2.peek() != '(') { st1.push(st2.pop() + ""); //弹出运算符栈 } st2.pop(); //弹出左括号
}
else 当辅助栈s2不空的时候,如果当前字符的优先级小于等于栈顶的优先级,不断把辅助栈里面的s2元素放到s1里面。最后记得把当前元素放到辅助栈里面。{
while (!st2.isEmpty()&&getPriority(c)<=getPriority(st2.peek())) { st1.push(st2.pop() + ""); } st2.push(c);
}
//遍历完以后辅助栈的全部放过去
public static String[] transToExpress(String s) {
// 数字直接入 表达式栈,符号先入辅助栈(后续遍历二叉树)。
Deque<String> st1 = new LinkedList<>(); //逆波兰表达式站
Deque<Character> st2 = new LinkedList<>(); //辅助栈
int i = 0;
while (i < s.length()) {
if (Character.isDigit(s.charAt(i))) { // 如果是数字
int index = i;
while (i < s.length() && Character.isDigit(s.charAt(i)))
i++;
st1.push(s.substring(index, i));
} else {
char c = s.charAt(i);
if (c == '(' || st2.isEmpty() || getPriority(c) > getPriority(st2.peek())) {
st2.push(c);
} else if (c == ')') {
while (st2.peek() != '(') {
st1.push(st2.pop() + ""); //弹出运算符栈
}
st2.pop(); //弹出左括号
} else {
while (!st2.isEmpty() && getPriority(c) <= getPriority(st2.peek())) {
st1.push(st2.pop() + "");
}
st2.push(c);
}
i++;
}
}
while (!st2.isEmpty()) { //遍历完以后辅助栈的全部放过去
st1.push(st2.pop() + "");
}
//无关
int j = st1.size() - 1;
String[] res = new String[st1.size()];
while (!st1.isEmpty()) {
res[j--] = st1.pop();
}
return res;
}