数据结构17:栈(06)

63 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

基于链式存储结构实现栈

上篇中,我们为大家设计并完善了栈的变种——双端栈。而在篇章的结尾,则提到了栈的另一种实现方式。从本篇开始,将为大家讲解基于链式存储结构的栈实现。

相比于由顺序表实现的栈,链式存储结构实现的栈要更加灵活,栈的入栈不在受数组长度影响,对空间的利用率更高。而与顺序表栈不同的是,链表栈只需要记录头结点就可以完成入栈和出栈操作。

由于链表头插入的特殊性质,使得头节点的next属性指向的永远都是最新插入的节点。而这又刚好与栈的出入栈规则——先进后出,后进先出向契合。

public class listStack{
    Node head;
    public void push();
    public int pop();
}

依照惯例,先设计构建链表栈的初始化方法。

public listStack
{
    this.head = new Node();
    this.head.value = 0;
}
​
public int length()     // 获取当前栈中已入栈元素的数量
{
    return this.head.value;
}

初始化链表栈时,创建头节点对象,并且我们利用在链表篇中学到的技巧,将栈中的元素数量放置在头节点中。

接下来再设计链表栈的入栈方法,我们在前面提到:头插入的添加元素方法刚好契合栈的入栈规则,因此push()方法也将使用头插入的逻辑来实现。

public void push(int value)     // 使用头插入实现的入栈方法
{
    Node next = new Node(value);
    next.addNext(this.head.next);
    this.head.addNext(next);
    this.head.value++;
}

小结

本篇中我们为大家介绍了栈的另一种实现结构,并为其设计了初始化和入栈方法。

天天学习,加速成长!

希望与各位一起变得越来越强!