1. 中缀计算器
public class InfixCalculator {
public static int infixCalculator(String expression) {
if (expression == null || expression.isEmpty()) {
throw new RuntimeException("null or empty");
}
ArrayStack2 digitStack = new ArrayStack2(expression.length());
ArrayStack2 operatorStack = new ArrayStack2(expression.length());
int number1 = 0;
int number2 = 0;
int operator = 0;
int result = 0;
String wholeNumber = "";
for (int i = 0; i < expression.length(); i++) {
char currentChar = expression.charAt(i);
if (ArrayStack2.isValidOperator(currentChar)) {
while (!operatorStack.isEmpty() && operatorStack.peekTop() == '*') {
number1 = digitStack.pop();
number2 = digitStack.pop();
operator = operatorStack.pop();
if (!operatorStack.isEmpty()) {
operator = ArrayStack2.changeOperator(operator, operatorStack.peekTop());
}
result = ArrayStack2.calculator(number1, number2, operator);
digitStack.push(result);
}
operatorStack.push(currentChar);
}
else if (digitStack.isValidNumber(currentChar)) {
wholeNumber += currentChar;
if (i == expression.length() - 1 || ArrayStack2.isValidOperator(expression.charAt(i + 1))){
digitStack.push(Integer.parseInt(wholeNumber));
wholeNumber = "";
}
if (!operatorStack.isEmpty() && operatorStack.peekTop() == '/') {
operatorStack.pop();
number1 = digitStack.pop();
number2 = digitStack.pop();
result = number2 / number1;
digitStack.push(result);
}
}
}
while (!operatorStack.isEmpty()) {
number1 = digitStack.pop();
number2 = digitStack.pop();
operator = operatorStack.pop();
if (!operatorStack.isEmpty()) {
operator = ArrayStack2.changeOperator(operator, operatorStack.peekTop());
}
result = ArrayStack2.calculator(number1, number2, operator);
digitStack.push(result);
}
return digitStack.pop();
}
}
2. 栈(为计算器服务)
class ArrayStack2 {
private int maxSize;
private int[] array;
private int top = -1;
public ArrayStack2(int maxSize) {
this.maxSize = maxSize;
this.array = new int[maxSize];
}
public boolean isFull() {
return this.top == this.maxSize - 1;
}
public boolean isEmpty() {
return this.top == -1;
}
public void push(int data) {
if (this.top == this.maxSize - 1) {
throw new RuntimeException("full");
}
this.top++;
this.array[top] = data;
}
public int pop() {
if (this.top == -1) {
throw new RuntimeException("empty");
}
int tempData = this.array[this.top];
this.array[this.top] = 0;
this.top--;
return tempData;
}
public int getLength() {
int count = 0;
for (int i = this.top; i >= 0; i--) {
count++;
}
return count;
}
public void displayAllDataFromTop() {
if (this.top == -1) {
throw new RuntimeException("empty");
}
for (int i = this.top; i >= 0; i--) {
System.out.printf("array[%d] -> %d\n", i, this.array[i]);
}
}
public static int operatorPriority(int operator) {
if (operator == '*' || operator == '/') {
return 1;
} else if (operator == '+' || operator == '-') {
return 0;
} else {
return -1;
}
}
public static boolean isValidOperator(int operator) {
return operator == '+' || operator == '-' || operator == '*' || operator == '/';
}
public static boolean isValidNumber(int number) {
return number == '0'
|| number == '1'
|| number == '2'
|| number == '3'
|| number == '4'
|| number == '5'
|| number == '6'
|| number == '7'
|| number == '8'
|| number == '9';
}
public static int calculator(int num1, int num2, int operator) {
int result = 0;
switch (operator) {
case '+':
result = num1 + num2;
break;
case '-':
result = num2 - num1;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num2 / num1;
break;
default:
break;
}
return result;
}
public static int changeOperator(int currentOperator, int preOperator) {
if (preOperator == '-' && currentOperator == '-') {
currentOperator = '+';
} else if (preOperator == '-' && currentOperator == '+') {
currentOperator = '-';
}
return currentOperator;
}
public int peekTop() {
return this.array[top];
}
}