数据结构与算法(八)链栈——栈的链式存储结构

链栈

栈的链式存储结构简称链栈,对链栈来说基本不存在栈满的情况,除非内存已经没有可以使用的空间

链栈其实也是线性表的单链表,只不过它是只能栈顶进出元素(线性表的表尾),我们看一下单链表和链栈的UML类图,LinkedList与LinkedStack是聚合关系,聚合关系是关联的一种形式,代表两个类之间的整体/局部关系。聚合暗示着整体在概念上处于比局部更高的一个级别,而关联暗示两个类在概念上位于相同的级别。聚合也转换成Java中的一个实例作用域变量。
在这里插入图片描述
也就是说LinkedStack是LinkedList的一个成员变量,既然如此,可以在链栈创建LinkedList对象list,实现LinkedStack调用list的方法即可,当然LinkedStack还有实现Stack接口,具体代码如下:

package DS02.动态链表;

import DS01.动态数组.Stack;
import java.util.Iterator;

public class LinkedStack<E> implements Stack<E> {
    //创建LinkedList对象
    private LinkedList<E> list;
	
	//获取有效元素个数
    @Override
    public int getSize() {
        return list.getSize();
    }
	//判空
    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }
	//入栈操作
    @Override	
    public void push(E e) {
        list.addFirst(e);
    }
	//出栈操作
    @Override
    public E pop() {
        return list.removeFirst();
    }
	//获取栈顶元素
    @Override
    public E peek() {
        return list.getFirst();
    }
	//清空链栈
    @Override
    public void clear() {
        list.clear();
    }
	//迭代器
    @Override
    public Iterator<E> iterator() {
        return list.iterator();
    }
}

对比顺序栈和链栈

对比一下顺序栈和链栈,它们在时间复杂度上是一样的,均为O(1),对于空间性能,顺序栈需要实现确定一个固定的长度,可能会存在空间浪费的问题,但它的优势是存取时定位方便,而链栈则要求每个元素都要有指针域,这同时增加了一些内存开销,但对于栈的长度无限制。所以他们的区别和线性表中讨论的一样。
如果栈的使用过程中元素变化不可预料,有时很小,有时非常大,那么最好用链栈,反之,如果它的变化在可控范围内,建议使用顺序栈会更一些。

发布了70 篇原创文章 · 获赞 56 · 访问量 1982

猜你喜欢

转载自blog.csdn.net/qq_43624033/article/details/103614782