只能实现个位数的运算
package com.atguigu.stack;import java.util.Scanner;/*** 用栈实现计算器,不能处理多位数运算* @author Dxkstart* @create 2021-10-08-17:45*/public class Calculator {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入计算式:");String expression = scanner.next();//创建两个栈,数栈、符号栈ArrayStack2 numStack = new ArrayStack2(10);ArrayStack2 operStack = new ArrayStack2(10);//定义需要的相关变量int index = 0;//用于扫描int num1 = 0;int num2 = 0;char oper = ' ';int res = 0;//存放结果char ch = ' ';//将每次扫描得到的char保存到ch//开始while循环的扫描expressionwhile (true){//依次得到expression的每一个字符ch = expression.substring(index,index+1).charAt(0);//判断ch是什么,然后做相应的处理if (operStack.isOper(ch)){//如果是运算符//判断当前的符号栈是否为空if (!operStack.isEmpty()){//如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符,就需要从数栈中pop出两个数,//再从符号栈中pop出一个符号,进行运算,将的到的结果,入数栈,然后将当前的操作符入符号栈if (operStack.priority(ch) <= operStack.priority(operStack.peek())){//当前的操作符的优先级小于或者等于栈中的操作符num1 = numStack.pop();num2 = numStack.pop();oper = (char) 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);//注意这里的ch是char型,不是int型, '1' = 48}//判断结束index++;if (index >= expression.length()){break;}}//当表达式扫描完毕,就顺序的从数栈和符号栈中pop出相应数和符号,并运算while (true){//如果符号栈为空,则计算到最后的结果,数栈中只有一个数字【结果】if (operStack.isEmpty()){break;}else {num1 = numStack.pop();num2 = numStack.pop();oper = (char) operStack.pop();//计算res = numStack.cal(num1, num2, oper);numStack.push(res);}}System.out.printf("表达式%s = %d",expression,numStack.pop());//输出最终结果}}//定义一个ArrayStack表示栈class ArrayStack2 {private int maxSize;//栈的大小private int[] stack;//数组,数组模拟栈,数据就放在该数组中private int top = -1;//top表示栈顶,初始化为-1//构造器//初始化栈public ArrayStack2(int maxSize) {this.maxSize = maxSize;stack = new int[maxSize];}//可以返回当前栈顶的数据,而不是弹出public int peek(){return stack[top];}//栈满public boolean isFull() {return top == maxSize - 1;}//栈空public boolean isEmpty() {return top == -1;}//入栈 - pushpublic void push(int value) {//先判断栈是否满if (isFull()) {System.out.println("栈满");return;}top++;stack[top] = value;}//出栈 - pop,将栈顶的数据返回public int pop() {//先判断是否为空if (isEmpty()) {//抛出异常throw new RuntimeException("栈空");}int value = stack[top];top--;return value;}//显示栈的所有数据【遍历栈】public void list() {//先判断是否为空if (isEmpty()) {//抛出异常throw new RuntimeException("栈空");}//需要从栈顶开始显示数据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){if (val == '+' || val == '-' || val == '*' || val == '/'){return true;}else {return false;}}//计算方法public int cal(int num1,int num2,char oper){int res = 0;//res用于存放计算的结果switch (oper){case '+':res = num1 + num2;break;case '-':res = num2 - num1;//注意顺序break;case '*':res = num1 * num2;break;case '/':res = num2 / num1;//注意顺序break;}return res;}}
