Java数据结构-栈

栈是一个运算受限的先进后出的线性表。仅限在表的一端进行运算操作操作

代码实现

接口

java 复制代码
public interface Stack<E> {

    /**
     * 进栈
     *
     * @param e 元素
     * @throws NullPointerException 不允许空元素
     */
    void push(E e);

    /**
     * 退栈
     *
     * @return 返回弹出元素
     * @throws java.util.NoSuchElementException 没有元素错误
     */
    E pop();

    /**
     * 取栈顶
     *
     * @return 返回栈顶元素
     * @throws java.util.NoSuchElementException 没有元素错误
     */
    E getTop();

    /**
     * 是否空栈
     *
     * @return 返回结果
     */
    boolean isEmpty();

    /**
     * 检查元素是否为空指针
     * @param e 元素
     */
    default void check(E e) {
        if (e == null) {
            throw new NullPointerException();
        }
    }
}

顺序表实现

java 复制代码
public class StackSequence<E> implements Stack<E> {

    private Object[] elementData;

    /**
     * 游标
     */
    private int top;

    public StackSequence(int initialCapacity) {
        this.top = -1;
        if (initialCapacity <= 0) {
            elementData = new Object[10];
            return;
        }
        elementData = new Object[initialCapacity];
    }

    @Override
    public void push(E e) {
        check(e);
        ++top;
        if (top == elementData.length) {
            grow();
        }
        elementData[top] = e;
    }

    private void grow() {
        // 当前值的1.5倍
        elementData = Arrays.copyOf(elementData, (elementData.length + 1) / 2 * 3);
    }

    @Override
    @SuppressWarnings("unchecked")
    public E pop() {
        if (top < 0) {
            throw new NoSuchElementException();
        }
        Object elementDatum = elementData[top];
        elementData[top] = null;
        top--;
        return (E) elementDatum;
    }

    @Override
    @SuppressWarnings("unchecked")
    public E getTop() {
        if (top < 0) {
            throw new NoSuchElementException();
        }
        return (E) elementData[top];
    }

    @Override
    public boolean isEmpty() {
        return top < 0;
    }

    public int size() {
        return elementData.length;
    }
}

栈链表实现

java 复制代码
public class QueueLink<E> implements Queue<E> {

    protected Node<E> head;
    protected Node<E> rear;

    public QueueLink() {
        this.rear = new Node<>(null, null);
        this.head = new Node<>(null, this.rear);
    }

    @Override
    public void enqueue(E e) {
        check(e);
        rear.element = e;
        Node<E> node = new Node<>(null, null);
        rear.next = node;
        rear = node;
    }

    @Override
    public E dequeue() {
        Node<E> next = head.next;
        check(next.element);
        head.next = next.next;
        return next.element;
    }

    @Override
    public boolean isEmpty() {
        return head.next.element == null;
    }

    @Override
    public E getHead() {
        E element = head.next.element;
        check(element);
        return element;
    }

    protected static class Node<E> {
        private E element;
        private Node<E> next;

        public Node(E element, Node<E> next) {
            this.element = element;
            this.next = next;
        }

        public E getElement() {
            return element;
        }

        public void setElement(E element) {
            this.element = element;
        }

        public Node<E> getNext() {
            return next;
        }

        public void setNext(Node<E> next) {
            this.next = next;
        }
    }
}

代码测试

Java 复制代码
/**
 * @author DawnStar
 * @since 2025/8/2
 */
public class StackTest {
    public static void main(String[] args) {

        // 顺序表实现
        StackSequence<String> stack = new StackSequence<>(3);
        System.out.print("栈顺序表:");
        stack.push("A");
        System.out.print(stack.pop());
        stack.push("B");
        stack.push("C");
        System.out.print(" " + stack.pop());
        stack.push("D");
        stack.push("E");
        System.out.print("、" + stack.pop());
        System.out.print("、" + stack.pop());
        System.out.print("、" + stack.pop() + "\n");
        System.out.println("栈顺序表大小:" + stack.size());


        Stack<String> linkStack = new StackLink<>();
        List<String> elements = List.of("A", "B", "C", "D", "E");
        System.out.println("栈链表进栈:" + String.join("、", elements));
        for (String element : elements) {
            linkStack.push(element);
        }
        System.out.print("出栈顺序:");
        while (!linkStack.isEmpty()) {
            System.out.print(" " + linkStack.pop());
        }
    }
}
相关推荐
青云交15 分钟前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图
艾莉丝努力练剑33 分钟前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
CHEN5_021 小时前
【Java基础面试题】Java基础概念
java·开发语言
二十雨辰1 小时前
[TG开发]照片机器人
java·web3
闪电麦坤952 小时前
数据结构:迭代方法(Iteration)实现树的遍历
数据结构·二叉树·
武昌库里写JAVA2 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
Cx330❀2 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
散1122 小时前
01数据结构-Prim算法
数据结构·算法·图论
落霞的思绪3 小时前
Java设计模式详细解读
java·开发语言·设计模式
Java小白程序员3 小时前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring