图解数据结构——链栈的基本操作

132 阅读1分钟

上一篇文章说到:顺序栈的算法 此篇文章说到:链式栈的实现以及基本运算

栈的链式存储

链式栈:顾名思义采用链式存储称为链式栈。

链式栈操作思路:

  1. header.next = null 时为空栈
  2. 只有内存溢出的情况下才会出现栈满,通常不考虑
  3. 插入的时候与单链表不同只能通过头插法插入数据
  4. 出栈时也是直接删除

先看图例:由于自己画的图太丑,只能自己去找了一张图片

image.png

栈的基本操作

创建栈

代码:

和单链表一样,需要有一个节点不仅要有数据本身还要有指向下一个节点的指针

public class LinkStackNode<E> {
    E data;
    LinkStackNode<E> next;

    public LinkStackNode(){
        this.next = null;
        this.data = null;
    }

    public LinkStackNode(E e){
        this.data = e;
        this.next = null;
    }
}

入栈:

由于只能从栈顶一端操作,所以向栈里插入数据时也只能采用头插法

图解

image.png

代码

/*
* 入栈
* */

public void push(E e){
    LinkStackNode<E> newStackNode = new LinkStackNode<>(e);     //头插法
    newStackNode.next = header.next;
    header.next = newStackNode;
}

出栈:

与顺序栈的思路一样,将要出的值暂存到临时的节点,后直接将原节点删除,

图解

image.png

代码

public E pop(){
    if (isEmpty()) throw new RuntimeException("栈空");       //取栈顶操作
    E e = header.next.data;
    header.next = header.next.next;
    return e;
}

取栈顶元素

这没什么好说的

/*
* 取栈顶元素
* */

public E peck(){
    if (isEmpty()) throw new RuntimeException("栈空");       //取栈顶操作
    E e = header.next.data;
    return e;
}

清空栈

很简单只需要让header.next = null ,后面的数据就被自动回收了

public void isNull(){
    header.next =null;
}