使用栈完成计算一个表达式的结果:
数栈 numStack:存放数
符号栈operStack:存放运算符
思路:
1、通过一个index值(索引),来遍历我们的表达式
2、如果我们发现是一个数字,就直接入数栈
3、如果发现扫描到的是一个符号,分如下情况解决:
如果当前符号栈为空,就直接入栈
如果符号栈有操作符,就进行比较,若当前操作符优先级小于或者等于栈中的操作符,就需要从数栈中pop出两个数,再从符号栈中pop出一个符号,进行运算,将得到的结果如数栈,然后将当前操作符入符号栈;如果当前操作符优先级大于栈中操作符,就直接入符号栈
4、当表达式扫描完毕,顺序的从数栈和符号栈中pop出相应的数和符号,并运行。
5、最后在数栈只有一个数字,就是表达式的结果。
代码实现:
public class Caculator{
public static void main(String[] args){
//根据分析思路,完成表达式的运算
String expression = "3+2*6-2";
//创建两个栈,数栈和符号栈
ArrayStack numStack = new ArrayStack2(10);
ArrayStack operStack = new ArrayStack2(10);
//定义需要的相关变量
int index = 0;//用于扫描
int num1 = 0;
int num2 = 0;
int oper = 0;
int res = 0;
char ch = ' ';//将每次扫描得到的char保存到ch
String keepNum = "";//用于拼接多位数
//开始while循环扫描expression
while(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