public class Calculator { public static void main(String[] args) { String expressoin = "7*2*2-5+1-5+3-4"; ArrayStack2 numStack = new ArrayStack2(10); ArrayStack2 operStack = new ArrayStack2(10); int index = 0; int num1 = 0; int num2 = 0; int oper = 0; int res = 0; char ch = ‘ ‘; String keepNum = "";//拼接多位数 while (true) { ch = expressoin.substring(index, index + 1).charAt(0); if (operStack.isOper(ch)) { if (!operStack.isEmpty()) { if (operStack.priority(ch) <= operStack.priority(operStack.peek())) { num1 = numStack.pop(); num2 = numStack.pop(); oper = operStack.pop(); res = numStack.cal(num1, num2, oper); numStack.push(res); operStack.push(ch); } else { operStack.push(ch); } } else { operStack.push(ch); } } else { // numStack.push(ch - 48); //处理多位数 keepNum += ch; //如果ch是expression最后一位则直接入栈 if(index==expressoin.length()-1){ numStack.push(Integer.parseInt(keepNum)); } else { //判断下一个数字是不是数字 是扫描 不是入栈 if (operStack.isOper(expressoin.substring(index + 1, index + 2).charAt(0))) { //是运算符 入栈 numStack.push(Integer.parseInt(keepNum)); keepNum = ""; } } } //让index+1 并判断是否扫描到expression最后 index++; if (index >= expressoin.length()) { break; } } while (true) { if (operStack.isEmpty()) { break; } num1 = numStack.pop(); num2 = numStack.pop(); oper = operStack.pop(); res = numStack.cal(num1, num2, oper); numStack.push(res); } System.out.println(expressoin + "=" + numStack.pop()); } } class ArrayStack2 { private int maxSize; private int[] stack; private int top = -1; public ArrayStack2(int maxSize) { this.maxSize = maxSize; stack = new int[this.maxSize]; } public int peek() { return stack[top]; } public boolean isFull() { return top == maxSize - 1; } public boolean isEmpty() { return top == -1; } public void push(int value) { if (isFull()) { System.out.println("栈满"); return; } top++; stack[top] = value; } public int pop() { if (isEmpty()) { throw new RuntimeException("栈空"); } int value = stack[top]; top--; return value; } public void list() { if (isEmpty()) { System.out.println("栈空"); return; } for (int i = top; i >= 0; i--) { System.out.printf("stack[%d]=%d\n", i, stack[i]); } } public int priority(int oper) { if (oper == ‘*‘ || oper == ‘/‘) { return 1; } else if (oper == ‘+‘ || oper == ‘-‘) { return 0; } else { return -1; } } public boolean isOper(char val) { return val == ‘+‘ || val == ‘-‘ || val == ‘*‘ || val == ‘/‘; } public int cal(int num1, int num2, int oper) { int res = 0; switch (oper) { case ‘+‘: res = num1 + num2; break; case ‘-‘: res = num2 - num1; break; case ‘*‘: res = num1 * num2; break; case ‘/‘: res = num2 / num1; break; } return res; } }
原文:https://www.cnblogs.com/bingbug/p/12083746.html