思路
- 建立两个栈,一个数栈numStack存放数字,符号栈operStack存放运算符
- 通过index,来遍历我们表达式
- 如果发现是一个数字,直接进数栈
- 如果扫描是符号,分一下情况
- 如果当前的符号栈为空,直接入符号栈
- 如果符号栈有运算符,就进行比较,
- 如果当前操作符的优先级小于或等于栈中的操作符,就需要从数栈中pop出两个数,在从符号栈中pop出一个符号,进行运算,将得到的结果,入数栈。将当前操作符入符号栈
- 如果当前操作符的优先级大于栈中操作符,就直接入符号栈
- 当表达式扫描完毕,就顺序从数栈和符号栈中pop出相应的数和符号,并运行。
- 最后数栈中只有一个数字,就是表达式的结果
代码实现
package com.stack;
public class Calculator {
public static void main(String[] args) {
// 测试
String expression = "3+2*6-2";
ArrayStack2 numStack = new ArrayStack2(20); // 数字栈
ArrayStack2 operStack = new ArrayStack2(20); // 符号栈
// 定义相关变量
int index = 0;// 定义索引
int num1 = 0, num2 = 0;
int oper = 0, res = 0;
char ch = ' ';// 每次扫描得到的char保存到ch
// 开始循环扫描expression
while (true) {
// 依次得到expression的每一个字符
ch = expression.substring(index, index + 1).charAt(0);
// 判断ch是什么,做相应