LStack——链栈——JAVA

LStack——链栈——JAVA


  • 链栈是对链表的一个模型,都是线性结构 ;


一、readme

  • 实现了链栈数据结构的重要操作:入栈和出栈;

  • 对于链栈:重要的是对栈顶指针(java中也就是对象(地址))的把握:

    • 重点(错过):栈顶top始终指向更靠近栈底的一个结点,在出入栈的过程中,栈顶始终指向栈底(多浪漫)
  • 备注:解释思路都在文档注释中;

二、写代码啦

1.先创建一下栈的基本单位——结点(就是普通的单链表节点)

  /**
     * 一个结点有数据域data,和指针next;
     *
     * 然后写个有参构造实现方法重载就好啦
     * 
     */
     Object data;
   	 SLNode next;

    public SLNode(Object data){
        this.data=data;

    }

2.然后写对结点形成链栈一些操作

(0)总体框架

    /**
     * 链栈的操作
     * 0、链栈的数据域;
     * 1、入栈
     * 2、出栈
     * 3、遍历所有元素
     * 4、测试
     */

(1)写链栈的数据域

//链栈的数据域;
    /**
     * 长度size;
     * 栈顶指针top;只需要一个栈顶指针就够了;
     */
    int size;
    SLNode top=null;//栈顶

(2)入栈push

//入栈
    /**
     * 思路:
     * 1、判断是否为空
     * 2、创建一个新的结点
     * 3、新结点的next指向top   ,注意:是新节点指向top,不是top指向新结点;(错过)
     * 4、top变为新结点位置进行,更新
     * 5、size++
     */
    public void pushOneLNode(Object data){
        SLNode newLNode =new SLNode(data);
        //栈为空
        if(top==null){
          top= newLNode;
          size++;
          return;
        }
        newLNode.next=top;//这一步,重点:新创建的节点指向已创建的栈结点;虽然top我远离了栈底但是我一直指向你;(错过)
        top=newLNode;
        size++;
    }

(3)出栈pop

//出栈
    /**
     * 思路:
     * 1、判断是否为空
     * 2、删除栈顶元素,top指向下一个元素   注意:top的next指向更靠近栈底一个元素;
     * 3、返回删除的元素
     */
    public Object popOneLNode(){
        if(top==null){
            System.out.println("没有结点可以删除");
            return null;
        }
        SLNode oldTopLNode =top;
        top=top.next;//这一步,重点:top的next指向更靠近栈底一个元素;(错过)
        size--;
        return oldTopLNode.data;
    }

(4)遍历所有元素

/**
     *  思路:
     *  1、判断是否为空
     *  2、从栈顶开始遍历,直到栈底  ,注意:不要直接操作top,因为top是栈顶,会改变栈结构
     *  3、每次遍历,都打印出来
     *  4、直到遍历到栈底,结束
     *
     */
    public void printAll(){
        if(top==null){
            System.out.println("没有元素可以遍历");
            return;
        }
        SLNode temp=top;//不要直接操作top,因为top是栈顶,会改变栈结构
        while(temp!=null){
            System.out.println(temp.data);
            temp=temp.next;
        }
    }


3、测试

//测试
    public static void main(String[] args) {
        STLinkOp stLinkOp=new STLinkOp();
        stLinkOp.pushOneLNode(1);//在栈底
        stLinkOp.pushOneLNode(2);
        stLinkOp.pushOneLNode(3);
        stLinkOp.pushOneLNode(4);//在栈顶



        stLinkOp.popOneLNode();
        stLinkOp.popOneLNode();



        stLinkOp.printAll();
    }

附录所有代码如下:

package LStack;

public class STLinkOp {
    /**
     * 链栈的操作
     * 0、链栈的数据域;
     * 1、入栈
     * 2、出栈
     * 3、遍历所有元素
     * 4、测试
     */




    //链栈的数据域;
    /**
     * 长度size;
     * 栈顶指针top;
     */
    int size;
    SLNode top=null;//栈顶
    //入栈
    /**
     * 思路:
     * 1、判断是否为空
     * 2、创建一个新的结点
     * 3、新结点的next指向top   ,注意:是新节点指向top,不是top指向新结点;(错过)
     * 4、top变为新结点位置进行,更新
     * 5、size++
     */
    public void pushOneLNode(Object data){
        SLNode newLNode =new SLNode(data);
        //栈为空
        if(top==null){
          top= newLNode;
          size++;
          return;
        }
        newLNode.next=top;//这一步,重点:新创建的节点指向已创建的栈结点;虽然top我远离了栈底但是我一直指向你;(错过)
        top=newLNode;
        size++;
    }

    //出栈
    /**
     * 思路:
     * 1、判断是否为空
     * 2、删除栈顶元素,top指向下一个元素   注意:top的next指向更靠近栈底一个元素;
     * 3、返回删除的元素
     */
    public Object popOneLNode(){
        if(top==null){
            System.out.println("没有结点可以删除");
            return null;
        }
        SLNode oldTopLNode =top;
        top=top.next;//这一步,重点:top的next指向更靠近栈底一个元素;(错过)
        size--;
        return oldTopLNode.data;
    }

    //遍历所有元素

    /**
     *  思路:
     *  1、判断是否为空
     *  2、从栈顶开始遍历,直到栈底  ,注意:不要直接操作top,因为top是栈顶,会改变栈结构
     *  3、每次遍历,都打印出来
     *  4、直到遍历到栈底,结束
     *
     */
    public void printAll(){
        if(top==null){
            System.out.println("没有元素可以遍历");
            return;
        }
        SLNode temp=top;//不要直接操作top,因为top是栈顶,会改变栈结构
        while(temp!=null){
            System.out.println(temp.data);
            temp=temp.next;
        }
    }
    //测试
    public static void main(String[] args) {
        STLinkOp stLinkOp=new STLinkOp();
        stLinkOp.pushOneLNode(1);//在栈底
        stLinkOp.pushOneLNode(2);
        stLinkOp.pushOneLNode(3);
        stLinkOp.pushOneLNode(4);//在栈顶



        stLinkOp.popOneLNode();
        stLinkOp.popOneLNode();



        stLinkOp.printAll();
    }
}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值