转换思路
1.初始化两个栈:运算符s1和存储中间结果s2
2.从左至右扫描中缀表达式
3.遇到操作数,将其压栈s2
4.如果遇到运算符比较其与s1栈顶符号的优先级
(1)如果s1为空则直接压栈
(2)否则,如果优先级高则直接入栈
(3)否则将是s1的栈顶元素弹出,并压入s2中再转到4.1中与新栈顶元素比较
5.遇到括号时
(1)"("直接压栈
(2)“)”弹出s1中的元素压入s2中知道遇到“(”,丢弃
6.重复2至5,直到表达式最右边
7.将s1中的元素依次弹出压入s2中,s2为逆波兰表达式
代码实现
public class Poland{
public static List<String> parseSuffixExpressionList(List<String> ls){
//符号栈
Stack<String> s1 = new Stack();
//因为数字栈没有出栈操作,所以用ArrayList代替
List<String> s2 = new ArrayList();
for(String item:ls){
//如果是数字就入栈
if(item.matches("\\d+")){
s2.add(item);
}else{
if(item.equals("(")){
s1.push(item);
}
else if(item.equals(")")){
while(!s1.peek().equals("(")){
s2.add(s1.pop());
}
s1.pop();//弹出“(”
}else {
while (s1.size() != 0 && new Operation().getValue(s1.peek()) >= new Operation().getValue(item)) {
s2.add(s1.pop());
}
//将item压入栈中
s1.push(item);
}
}
}
while(s1.size() != 0){
s2.add(s1.pop());
}
//因为是List 所以顺序就是倒序了
return s2;
}
}