桟是一种遵先进后出逻辑的线性数据结构。

桟的常用操作

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();


桟的实现

因为桟是一种具有新进后出规则的线性数据结构,所以可以通过链表或者数组来手动实现一个桟。

  1. 基于链表实现
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;
    }
}

  1. 基于列表实现
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]);
    }
}