桟是一种遵先进后出逻辑的线性数据结构。
桟的常用操作
Stack<Integer> stack = new Stack<>(); // 桟的初始化
//入桟
stack.push(1);
stack.push(3);
stack.push(6);
// 访问桟顶元素
int peek = stack.peek();
// 出站
int pop = stack.pop();
// 访问桟的长度
int size = stack.size();
// 判断是否为空
boolean isEmpty = stack.isEmpty();
桟的实现
因为桟是一种具有新进后出规则的线性数据结构,所以可以通过链表或者数组来手动实现一个桟。
- 基于链表实现
class LinkedListStack {
ListNode stackPeek; // 将头节点作为栈顶 ListNode 是手动实现的链表类型
private int stkSize; // 链表的长度
public LinkedListStack() {
stackPeek = null;
}
// 返回链表长度
public int size() {
return stkSize;
}
// 链表是否为空
public boolean isEmpty() {
return size() == 0;
}
// 入栈
public void push(int num) {
ListNode node = new ListNode(num); // 创建一个新的节点
node.next = stackPeek; // 新节点指向当前栈顶节点
stackPeek = node; // 更新栈顶节点为新节点
stkSize++; // 栈的大小加1
}
// 出栈
public int pop() {
if (isEmpty())
throw new IndexOutOfBoundsException("栈为空"); // 如果栈为空,抛出异常
int num = peek(); // 获取栈顶元素的值
stackPeek = stackPeek.next; // 栈顶指针指向下一个节点
stkSize--; // 栈的大小减1
return num; // 返回弹出的元素值
}
// 访问栈顶元素
public int peek() {
if (isEmpty())
throw new IndexOutOfBoundsException("栈为空"); // 如果栈为空,抛出异常
return stackPeek.value; // 返回栈顶元素的值
}
// 转化为数组
public int[] toArray() {
ListNode node = stackPeek; // 从栈顶节点开始遍历
int[] res = new int[size()]; // 创建一个数组来存放栈中的元素
for (int i = res.length - 1; i >= 0; i--) {
res[i] = node.value; // 将栈中的元素依次存入数组
node = node.next; // 移动到下一个节点
}
return res; // 返回数组
}
}
class ListNode {
int value;
ListNode next;
public ListNode(int value) {
this.value = value;
}
}
- 基于列表实现
import java.util.ArrayList;
public class ArrayListStack {
private ArrayList<Integer> stack;
public ArrayListStack(){
stack = new ArrayList<>(); //初始化
}
//长度
public int size(){
return stack.size();
}
//是否为空
public boolean isEmpty(){
return stack.isEmpty();
}
//入桟
public void push(int num){
stack.add(num);
}
//出桟
public int pop(){
if (isEmpty())
throw new IndexOutOfBoundsException();
return stack.remove(size()-1);
}
//访问桟顶
public int peek(){
if (isEmpty())
throw new IndexOutOfBoundsException();
return stack.get(size()-1);
}
//转化为数组
public Integer[] toArray() {
return stack.toArray(new Integer[0]);
}
}