逆波兰计算器
将中缀表达式转变为逆波兰表达式
思路:
代码实现:
public static List<String> parseSuffixExpression(List<String> list){
//定义两个栈
Stack<String> s1 = new Stack<String>();//符号栈s1
//s2栈在整个过程中没有pop操作,且需要逆序输出
//所以使用List替换stack
List<String> s2 = new ArrayList<String>();//存储中间结果栈s2
//遍历list
for (int i = 0; i < list.size(); i++) {
//如果遍历到操作符
if (oper(list.get(i))){
//遇到括号时
if ("(".equals(list.get(i))){
s1.push(list.get(i));
}else if (")".equals(list.get(i))){
if (!s1.isEmpty()){
while (true){
if (s1.peek().equals("(")){
s1.pop();
break;
}
s2.add(s1.pop());
}
}else {
continue;
}
//判断操作符的优先级
}else if ("*".equals(list.get(i)) || "/".equals(list.get(i))){
if (!s1.isEmpty()){
if ("*".equals(s1.peek()) || "/".equals(s1.peek())){
s2.add(s1.pop());
s1.push(list.get(i));
}else if ("-".equals(s1.peek()) || "+".equals(s1.peek())){
s1.push(list.get(i));
}else {
s1.push(list.get(i));
}
}else {
s1.push(list.get(i));
}
}else if ("+".equals(list.get(i)) || "-".equals(list.get(i))){
if (!s1.isEmpty()){
if ("*".equals(s1.peek()) || "/".equals(s1.peek())
|| "-".equals(s1.peek()) || "+".equals(s1.peek())) {
s2.add(s1.pop());
s1.push(list.get(i));
}else {
s1.push(list.get(i));
}
}
}else {
throw new RuntimeException();
}
}else {
s2.add(list.get(i));
}
}
while (!s1.isEmpty()){
s2.add(s1.pop());
}
return s2;
}
//判断是否为操作符
public static boolean oper(String s){
System.out.println("+".equals(s));
return "+".equals(s) || "-".equals(s) || "*".equals(s)
|| "/".equals(s) || "(".equals(s) || ")".equals(s);
}