diff --git a/src/dataANDcalc/java/stack/ArrayStack.java b/src/dataANDcalc/java/stack/ArrayStack.java index cedd7de..4a128b2 100644 --- a/src/dataANDcalc/java/stack/ArrayStack.java +++ b/src/dataANDcalc/java/stack/ArrayStack.java @@ -50,7 +50,7 @@ public class ArrayStack { return top == -1; } - public void push(int data){ + public void push(Object data){ if(isFull()){ System.out.println("栈满,无法加入新数据"); return; diff --git a/src/dataANDcalc/java/stack/ReversePoland.java b/src/dataANDcalc/java/stack/ReversePoland.java index 6cf4140..472bbe7 100644 --- a/src/dataANDcalc/java/stack/ReversePoland.java +++ b/src/dataANDcalc/java/stack/ReversePoland.java @@ -1,25 +1,33 @@ package stack; -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; -import java.util.Stack; +import java.util.*; import java.util.regex.Pattern; public class ReversePoland { private ArrayStack numStack = new ArrayStack(10); + private ArrayStack operStack = new ArrayStack(20); + + private ArrayStack tempStack = new ArrayStack(20); + private List expressList = new ArrayList<>(); + /** + * 逆波兰表达式计算 + * @param expression + * @return + */ public int calculate(String expression){ translateExpress(expression); int length = expressList.size(); String operRegex = "[+\\-*/]"; Pattern operPattern = Pattern.compile(operRegex); + //从左往右开始扫描 for (int i = 0; i priority(operStack.top())){ + // 如果当前符号优先级大于符号栈顶,则直接入符号栈 + operStack.push(str); + break; + } else { + // 如果都不符合以上条件,则将符号栈顶元素弹出,直至符合上述3个条件其中一个为止 + String topStr = operStack.pop(); + tempStack.push(topStr); + } + } + } + } + //将运算符栈中的数据全部弹出到临时栈中 + while (true) { + if (operStack.isEmpty()){ + break; + } + String topStr = operStack.pop(); + tempStack.push(topStr); + } + reverse(); + } + + public int priority(String oper){ + if ("+".equals(oper) || "-".equals(oper)){ + return 0; + } + return 1; + } + + public void reverse(){ + while (true) { + if (tempStack.isEmpty()){ + break; + } + expressList.add(tempStack.pop()); + } + Collections.reverse(expressList); + System.out.println("逆波兰表达式为:"); + for (String str : expressList){ + System.out.print(str + ";"); } }