From dece7fcaa05072309072df165f71853ec56b3b5d Mon Sep 17 00:00:00 2001 From: liangjinglin Date: Tue, 14 Jan 2025 16:51:22 +0800 Subject: [PATCH] =?UTF-8?q?2025-01-14=20=E5=AE=8C=E6=95=B4=E9=80=86?= =?UTF-8?q?=E6=B3=A2=E5=85=B0=E8=AE=A1=E7=AE=97=E5=99=A8=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dataANDcalc/java/stack/ArrayStack.java | 2 +- src/dataANDcalc/java/stack/ReversePoland.java | 126 ++++++++++++++++-- 2 files changed, 119 insertions(+), 9 deletions(-) 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 + ";"); } }