《算法思维——一种问题驱动的思维方式》之第8篇:数据结构之动态栈篇——采用Java编程语言实现

《算法思维——一种问题驱动的思维方式》之第8篇:数据结构之动态栈篇——采用Java编程语言实现

在这里插入图片描述
在数据结构的学习中,动态栈是最常见的一种线性数据结构,使用范围广。

栈,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。

在这里插入图片描述

按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。

栈是允许在同一端进行插入和删除操作的特殊线性表。

允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。

插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表。

在创建动态栈时,对不同节点之间的链接关系梳理清楚,这一点十分重要。。。

比如,下面开始试着用Java编程语言来实现动态栈的基本操作,包括:

  1. 在动态栈中插入节点(push操作)
  2. 在动态栈中删除节点 (pop操作)
  3. 返回动态栈的栈顶节点 (peek操作)
  4. 求动态栈的长度 (返回长度)
  5. 打印输出动态栈的全部元素

动态栈的节点,可以按如下方式定义:
在这里插入图片描述

动态栈的节点的实现源代码,可参考以下程序,

/**
 *
 * @作者: 文方俊
 * @日期:2020年11月30日
 * @功能:动态栈的节点的实现
 */
    protected class Node{
        public int getValue(){
            return this.value;
        }
        Node(int value){
            this.value=value;
            this.next=null;
        };
        private int value;
        private Node next;
    };    
  1. 在动态栈中插入节点(push操作)

在这里插入图片描述
如上图,包含值为1和值为2的两个节点进栈后,栈中多出了两个新节点。

动态栈中插入节点(push操作)的源代码,可参考如下程序,

/**
 *
 * @作者: 文方俊
 * @日期:2020年11月30日
 * @功能:动态栈中插入节点(push操作)
 */
    public void push(int value){    
        Node newNode=new Node(value);
        if(null==this.top){
            this.top=newNode;
        }else{
            newNode.next=this.top;
            this.top=newNode;
        }
        this.length++;
    }
  1. 在动态栈中删除节点 (pop操作)

在这里插入图片描述
如上图,包含值为2的节点出栈后,栈中还剩下值为1的节点。

动态栈中删除节点操作(pop操作)的源代码,可参考如下程序,

/**
 *
 * @作者: 文方俊
 * @日期:2020年11月30日
 * @功能:动态栈中删除节点(pop操作)
 */
    public Node pop(){
        if(null==this.top){
            return null;
        }else{
            Node popNode=this.top;
            this.top=this.top.next;
            this.length--;
            return popNode;
        }        
    }
  1. 返回动态栈的栈顶节点 (peek操作)

在这里插入图片描述
如上图,包含值为1和值为2的两个节点进栈后,栈中多出了两个新节点。

返回动态栈的栈顶节点 (peek操作)的源代码,可参考如下程序,

/**
 *
 * @作者: 文方俊
 * @日期:2020年11月30日
 * @功能:动态栈中返回栈顶节点 (peek操作)
 */
    public Node peek(){        
        return this.top;
    }
  1. 求动态栈的长度 (返回长度)

在这里插入图片描述

如上图所示的动态栈,栈的总长度为2。

求动态栈的长度 (返回长度)的源代码,参考如下,

/**
 *
 * @作者: 文方俊
 * @日期:2020年11月30日
 * @功能:动态栈中返回栈的长度 
 */
    public int length(){
    	return this.length;
    }
  1. 打印输出动态栈的全部元素
    在这里插入图片描述
    如上图所示的动态栈,打印输出全部栈中元素依次为 2 -> 1。

打印输出动态栈的全部元素的程序实现,可参考如下源代码,

/**
 *
 * @作者: 文方俊
 * @日期:2020年11月30日
 * @功能:打印输出动态栈的全部元素
 */
    public ArrayList printStack(){        
        ArrayList values=new ArrayList(0);
        Node tmp=this.top;
        while(null!=tmp){   
            values.add(tmp.value);
            tmp=tmp.next;
        }
        return values; 
    }

完整的程序实现,可关注本人微信公众号“AI早知道”获取。。。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦-无-殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值