前言:本文大部分思想和代码来自尚硅谷。该文章提供代码分析的不同角度。下面开始正文。
思路解析:
1、首先我们需要两个栈,一个是数字栈存放数字,一个字符栈存放字符,然后根据符号优先级定义出栈顺序。
2、具体如下
2.1 通过一个 index 值(索引),来遍历我们的表达式如果我们发现是一个数字, 就直接入数栈。
2.2 如果发现扫描到是一个符号, 就分如下情况:
2.2.1 如果发现当前的符号栈为 空,就直接入栈
2.2.2 如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作 符, 就需要从数栈中pop出两个数,在从符号栈中pop出一个符号,进行运算,将得到结果,入 数栈,然后将当前的操作符入符号栈, 如果当前的操作符的优先级大于栈中的操作符, 就直 接入符号栈.
2.3 当表达式扫描完毕,就顺序的从 数栈和符号栈中pop出相应的数和符号,并运行.
2.4 最后在数栈只有一个数字,就是表达式的结果
代码实现:
1、计算器的主要逻辑方法,如果需要更多的了解栈的基本概念,可以看看我转载的栈的思路和代码实现。
class ArrayStack2{
private int maxSize;
private int[] stack;
private int top=-1;
public ArrayStack2(int maxSize) {
this.maxSize = maxSize;
stack= new int[maxSize];
}
//偷看栈顶的值,用来给priority方法进行判断符号优先级的。
public int peek() {
return stack[top];