使用链表实现栈

这篇文章使用数组实现了栈(实现泛型接口,更加地面向对象),本文使用链表(链式存储结构实现栈)。

链表是基于 Node 类实现。

a linked list is a recursive data structure that is either empty(null) or a reference to a node having a generic item and a reference to a linked list

Node 类实现如下:

    private class Node{
        /**
         * 当前元素
         */
        Item item;
        /**
         * 下一个元素的指针
         */
        Node next;
    }

由于栈是先入后出的特征,入栈操作可转化为在链表头插入元素,出栈操作可转化为删除链表头结点,因此只需要一个链接结点即可表示栈,然后再用一个整型变量n表示栈的长度。
基于链表的栈实现如下:

public class Stack<Item> {

    /**
     * top of stack
     */
    private Node first;
    /**
     * number of items
     */
    private int n;


    public void push(Item item) {
        //相当于往链表的头结果插入一个元素
        Node oldFirst = first;
        first = new Node();
        first.item = item;
        first.next = oldFirst;
        //栈中的元素数量加1
        n++;
    }

    public Item pop() {
        //相当于删除链表的头结点
        if (n == 0) {
            throw new RuntimeException("栈为空,不能出栈");
        }
        Item item = first.item;
        first = first.next;
        n--;
        return item;
    }


    public int size() {
        return n;
    }

    public boolean isEmpty() {
        return n == 0 ? true : false;
    }



    private class Node{
        /**
         * 当前元素
         */
        Item item;
        /**
         * 下一个元素的指针
         */
        Node next;
    }


    public static void main(String[] args) {
        Stack<Integer> mystack = new Stack<>();
        mystack.push(1);
        mystack.push(2);
        mystack.push(3);
        System.out.println(mystack.size());
        System.out.println(mystack.isEmpty());

        System.out.println(mystack.pop());
        System.out.println(mystack.pop());
        System.out.println(mystack.pop());

        System.out.println(mystack.size());
        System.out.println(mystack.isEmpty());

        System.out.println(mystack.pop());
    }
}

原文:https://www.cnblogs.com/hapjin/p/15996862.html

posted @ 2022-03-12 13:04  大熊猫同学  阅读(376)  评论(0编辑  收藏  举报