什么是栈?
栈是一种线性数据结构,相比于数组,栈对应的操作是数组的子集,只能从一端添加元素,也只能从一端取出元素,而这一端称为栈顶。
存储方式如下:
栈也是一种后进先出(Last In First Out,简称LIFO)的数据结构,最先进入的元素存放于栈低,后进入的元素存放于栈顶,并且在计算机的世界里,栈拥有着不可思议的作用。如:
- 无处不在的撤销操作
- 程序调用的系统栈
栈的实现
1、入栈
入栈操作(push)就是把元素放入栈中,并且只允许从栈顶一侧放入新元素,新元素的位置将会成为栈顶。
2、出栈
出栈操作(pop)就是把栈顶元素从栈中弹出,出栈元素的前一个元素会重新成为新的栈顶。
通过数组实现栈,整体代码如下:
/**
* 描述:栈所需要的方法
* <p>
* Create By ZhangBiao
* 2020/5/9
*/
public interface Stack<E> {
/**
* 入栈操作
*
* @param e
*/
void push(E e);
/**
* 出栈操作
*
* @return
*/
E pop();
/**
* 查看栈顶元素
*
* @return
*/
E peek();
/**
* 获取栈元素个数
*
* @return
*/
int getSize();
/**
* 判断栈是否为空
*
* @return
*/
boolean isEmpty();
}
/**
* 描述:基于动态数组实现栈。
* <p>
* Create By ZhangBiao
* 2020/4/21
*/
public class ArrayStack<E> implements Stack<E> {
private Array<E> array;
public ArrayStack() {
this.array = new Array<>();
}
public ArrayStack(int capacity) {
this.array = new Array<>(capacity);
}
@Override
public void push(E e) {
this.array.addLast(e);
}
@Override
public E pop() {
return this.array.removeLast();
}
@Override
public E peek() {
return this.array.getLast();
}
@Override
public int getSize() {
return this.array.getSize();
}
@Override
public boolean isEmpty() {
return this.array.isEmpty();
}
@Override
public String toString() {
StringBuilder result = new StringBuilder();
result.append("Stack: ");
result.append("[");
for (int i = 0; i < array.getSize(); i++) {
result.append(array.get(i));
if (i != array.getSize() - 1) {
result.append(", ");
}
}
result.append("] top");
return result.toString();
}
}