什么是栈?
简单讲就是先进后出,吃进去吐出来,可以用链表实现,也可以用数组实现
我们来看看jdk1.8中栈的源码
public
class Stack<E> extends Vector<E> {
/**
* Creates an empty Stack.
*/
public Stack() {
}
public E push(E item) {
addElement(item);
return item;
}
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
public boolean empty() {
return size() == 0;
}
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = 1224463164541339165L;
}
可以看出,它是继承Vertor,并且封装了自己特有的的几个方法
自定义栈实现中缀表达式计算
一共包含四个类,第一个是栈的操作,第二第三个是和操作相关
大概的算法思想
0.创建数字栈和符号栈
1.创建index用来循环扫描expression
2.如果E[index]是数字,直接入数栈
3.若E[index]是符号,
1)如果当前的符号栈为空,入符号栈
2)如果当前符号栈不为空,进行比较
1)如果当前操作符优先级《=OperStack栈顶的操作符
就从numStack中pop两个数,从符号栈中pop一个operator,进行运算,将运算结果进numStack,再把当前operator进operStack。
2)如果 > operStack[top],直接入operStack.
4.如果栈中最后只有一个数字,那就是结果
ArrayStack .java 包含了栈的相关操作
/**
* @author Administrator
* @date 2019/6/14/14:05
*/
public class ArrayStack {
/**
* 栈的最大容量
*/
private int maxSize;
/**
* 用数组模拟栈
*/
private int[] stack;
/**
* 栈顶指针,初始位置为-1
*/
int top = -1;