目录
一、栈(Stack)
1.概念
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
栈顶(Top):线性表允许进行插入删除的那一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素的空表。
2.栈的使用
方法 | 功能 |
Stack() | 构造一个空栈 |
E push(E e) | 讲e入栈,并返回e |
E pop() | 讲栈顶元素出栈并返回 |
E peek() | 获取栈顶元素 |
int size() | 获取栈中元素个数 |
boolean isEmpty() | 判断栈是否为空 |
3.栈的模拟实现
底层用数组
初始化
public int[] elem;
//当前栈 当中 存储的有效的数据个数 也可以当中 当前可以存放数据元素的下标
public int usedSize;
public static final int DEFAULT_CAPACITY = 10;
public MyStack() {
elem = new int[DEFAULT_CAPACITY];
}
压栈(入栈)
在进行此步操作是需要判断数组是否已满,来确定是否需要扩容操作。
/**
* 压栈
*/
public void push(int val) {
//1、判断栈是否是满的
if(isFull()) {
elem = Arrays.copyOf(elem,2*elem.length);
}
//存放到当前的下标,同时usedSize需要自增
elem[usedSize] = val;
usedSize++;
}
/**
* 判断 当前栈是否是满的
* @return
*/
public boolean isFull() {
if(usedSize == elem.length) {
return true;
}
return false;
}
弹出栈顶元素(出栈)
此步需要判断此时栈是否为空,以为栈为空的话无法弹出元素。
/**
* 删除栈顶元素
* @return
*/
public int pop(){
if(isEmpty()) {
throw new EmptyStackException("栈为空了!");
}
int oldVal = elem[usedSize-1];
usedSize--;
return oldVal;
}
/**
* 是否为空
* @return
*/
public boolean isEmpty() {
return usedSize == 0;
}
peek操作
这里也需要判空。
/**
* 获取栈顶元素 但是不删除
* @return
*/
public int peek() {
if(isEmpty()) {
throw new EmptyStackException("栈为空了!");
}
return elem