上一篇文章说到:顺序栈的算法 此篇文章说到:链式栈的实现以及基本运算
栈的链式存储
链式栈:顾名思义采用链式存储称为链式栈。
链式栈操作思路:
- header.next = null 时为空栈
- 只有内存溢出的情况下才会出现栈满,通常不考虑
- 插入的时候与单链表不同只能通过头插法插入数据
- 出栈时也是直接删除
先看图例:由于自己画的图太丑,只能自己去找了一张图片
栈的基本操作
创建栈
代码:
和单链表一样,需要有一个节点不仅要有数据本身还要有指向下一个节点的指针
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;
}
}
入栈:
由于只能从栈顶一端操作,所以向栈里插入数据时也只能采用头插法
图解
代码
/*
* 入栈
* */
public void push(E e){
LinkStackNode<E> newStackNode = new LinkStackNode<>(e); //头插法
newStackNode.next = header.next;
header.next = newStackNode;
}
出栈:
与顺序栈的思路一样,将要出的值暂存到临时的节点,后直接将原节点删除,
图解
代码
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;
}