2025-01-14 1.优化栈类(支持多种类型) 2.逆波兰表达式计算

This commit is contained in:
liangjinglin 2025-01-14 14:58:32 +08:00
parent bba8bce10f
commit 30cfd63a65
3 changed files with 96 additions and 12 deletions

View File

@ -2,19 +2,20 @@ package stack;
import queue.ArrayQueue;
import java.util.Objects;
import java.util.Scanner;
public class ArrayStack {
public class ArrayStack<E> {
private int top = -1;
private int maxSize;
private int[] stack;
private Object[] stack;
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
stack = new int[maxSize];
stack = new Object[maxSize];
}
public int getTop() {
@ -33,11 +34,11 @@ public class ArrayStack {
this.maxSize = maxSize;
}
public int[] getStack() {
public Object[] getStack() {
return stack;
}
public void setStack(int[] stack) {
public void setStack(Object[] stack) {
this.stack = stack;
}
@ -58,20 +59,20 @@ public class ArrayStack {
stack[top] = data;
}
public int pop(){
public E pop(){
if(isEmpty()){
throw new RuntimeException("栈空了");
}
int value = stack[top];
E value = (E) stack[top];
top --;
return value;
}
public int top(){
public E top(){
if(isEmpty()){
throw new RuntimeException("栈空了");
}
int value = stack[top];
E value = (E) stack[top];
return value;
}
@ -85,7 +86,7 @@ public class ArrayStack {
}
public static void main(String[] args) {
ArrayStack arrayStack = new ArrayStack(5);
ArrayStack<Integer> arrayStack = new ArrayStack(5);
Scanner scan = new Scanner(System.in);
while (true) {
System.out.println("a存数, g取数, s查看, exit退出:");

View File

@ -13,9 +13,9 @@ public class CalculatorByStack {
private final static int DIV = 4;
private ArrayStack numStack = new ArrayStack(10);
private ArrayStack<Integer> numStack = new ArrayStack(10);
private ArrayStack operStack = new ArrayStack(10);
private ArrayStack<Integer> operStack = new ArrayStack(10);
public void calculate(String expression) {
int length = expression.length();

View File

@ -0,0 +1,83 @@
package stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;
import java.util.regex.Pattern;
public class ReversePoland {
private ArrayStack<Integer> numStack = new ArrayStack(10);
private List<String> expressList = new ArrayList<>();
public int calculate(String expression){
translateExpress(expression);
int length = expressList.size();
String operRegex = "[+\\-*/]";
Pattern operPattern = Pattern.compile(operRegex);
for (int i = 0; i<length;i++){
String str = expressList.get(i);
if (operPattern.matcher(str).matches()) {
if("+".equals(str)){
int num1 = numStack.pop();
int num2 = numStack.pop();
int result = num1 + num2;
numStack.push(result);
}
if("-".equals(str)){
int num1 = numStack.pop();
int num2 = numStack.pop();
int result = num2 - num1;
numStack.push(result);
}
if("*".equals(str)){
int num1 = numStack.pop();
int num2 = numStack.pop();
int result = num2 * num1;
numStack.push(result);
}
if("/".equals(str)){
int num1 = numStack.pop();
int num2 = numStack.pop();
int result = num2/num1;
numStack.push(result);
}
} else {
numStack.push(Integer.parseInt(expressList.get(i)));
}
}
return numStack.pop();
}
public void translateExpress(String expression){
String[] strArr = expression.split(";");
for (String str : strArr){
expressList.add(str);
}
}
public static void main(String[] args) {
ReversePoland reversePoland = new ReversePoland();
Scanner scan = new Scanner(System.in);
while (true) {
System.out.println("c计算, s查看, exit退出:");
String handle = scan.next();
if ("exit".equals(handle)){
break;
}
if ("c".equals(handle)){
System.out.println("请输入计算表达式:");
String expression = scan.next();
int calculate = reversePoland.calculate(expression);
System.out.println("计算结果为:" + calculate);
}
if ("s".equals(handle)){
}
}
scan.close();
}
}