zoukankan      html  css  js  c++  java
  • 漫画趣解——什么是栈?

    写在前面:

    栈是一种受限的线性表,在数据结构中也很常见。
    下面,时光采用漫画的形式来说一说这个栈。

    思维导图

    在这里插入图片描述

    什么是栈?

    在这里插入图片描述

    栈是一种受限线性表,也就是说,栈元素具有线性关系,即前驱后继关系;
    只不过它是 一种特殊的线性表而已;

    栈的特性?

    在这里插入图片描述

    如图:

    线性表是在表尾进行插入和删除操作,而在栈中表尾是指栈顶,而不是栈底;
    栈的数据操作始终只在栈顶进行,即先进后出,后进先出;

    顺序栈和链栈


    代码实现

    顺序栈:

    栈的顺序存储结构简称顺序栈;
    利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素;
    同时附设指针top指示栈顶元素在顺序表中的位置;

    1,先写实体类SeqStack;

    属性有栈的容量,结点数据以及栈的实际大小(即长度)

    package com.java.model;
    
    public class SeqStack {
        //动态数组的最大容量
        public final static int Max_Size=1024;
    
        //栈的结点数据
        public Object[] data;
        //栈的长度,用来标识数组中的元素个数
        public int size;
    
        //构造函数
        public SeqStack(Object[] data, int size) {
            this.data = data;
            this.size = size;
        }
    }
    
    

    2,写栈的方法类SeqStackDao;

    包括入栈、出栈、查看栈顶元素等等;

    package com.java.dao;
    
    import com.java.model.SeqStack;
    
    import static com.java.model.SeqStack.Max_Size;
    
    public class SeqStackDao {
        //初始化栈
        public SeqStack Init_SeqStack(){
            //动态数组初始化,加数组容量
            Object[] data1=new Object[Max_Size];
    
            //栈初始化,元素个数size为0
            SeqStack stack=new SeqStack(data1,0);
    
            //数组赋值
            for(int i=0;i<Max_Size;i++){
                stack.data[i]=0;
            }
            return stack;
        }
        //入栈
        public void Push_SeqStack(SeqStack stack,Object data){
            if(stack==null){
                return;
            }
            if(data==null){
                return;
            }
            //如果栈容量小于或等于数组容量
            if(stack.size==Max_Size){
                return;
            }
            //元素入栈
            stack.data[stack.size]=data;
            stack.size++;
        }
        //查找栈顶元素
        public Object Top_SeqStack(SeqStack stack){
            if(stack==null){
                return null;
            }
            //若栈元素为0,则返回null
            if(stack.size==0){
                return null;
            }
            //栈顶元素,注意数组下标从0开始,所以要减1
            Object o=stack.data[stack.size-1];
            return o;
        }
        //出栈操作
        public void Pop_SeqStack(SeqStack stack){
            if(stack==null){
                return;
            }
            if(stack.size==0){
                return;
            }
            //出栈
            stack.size--;
        }
        //判断是否为空
        public boolean IsEmpty(SeqStack stack){
            if(stack==null){
                return false;
            }
            if(stack.size==0){
                return true;
            }
            return false;
        }
        //返回栈中元素的个数
        public int Size_SeqStack(SeqStack stack){
            return stack.size;
        }
        //清空栈
        public void Clear_SeqStack(SeqStack stack){
            if(stack==null){
                return;
            }
            for(int i=0;i<stack.size;i++){
                stack.data[i]=null;
            }
            stack.size=0;
        }
    }
    
    

    3,主函数Main;

    包括主函数,来测试栈的各种方法;

    package com.java.main;
    
    import com.java.dao.SeqStackDao;
    import com.java.model.SeqStack;
    
    public class SeqStackMain {
        public static void main(String[] args) {
            SeqStackDao seqStackDao=new SeqStackDao();
            //初始化栈
            SeqStack stack=seqStackDao.Init_SeqStack();
    
            //入栈
            seqStackDao.Push_SeqStack(stack,"A");
            seqStackDao.Push_SeqStack(stack,"B");
            seqStackDao.Push_SeqStack(stack,"C");
            seqStackDao.Push_SeqStack(stack,"D");
            seqStackDao.Push_SeqStack(stack,"E");
    
            //输出栈元素
            while(stack.size>0) {
                //查找栈顶元素
                Object o = seqStackDao.Top_SeqStack(stack);
                System.out.println(o);
                //出栈
                seqStackDao.Pop_SeqStack(stack);
            }
        }
    }
    
    

    运行结果:

    链栈:

    栈的链式存储简称链栈;
    存储结构类似于链表;

    1,先写实体类LinkStackNode和LinkStack;

    LinkStackNode:
    包括链栈结点的数据域和指针域;
    数据域是Object类型的,指针域是LinkStackNode类型的
    LinkStack:
    包括链栈的栈顶指针和链表元素个数;
    栈顶指针是LinkStackNode类型的,链栈元素个数是int型的

    package com.java.model;
    
    public class LinkStackNode {
        //栈结点的数据域
        public Object data;
        //栈结点的指针
        public LinkStackNode next;
    
        //构造方法
        public LinkStackNode(Object data, LinkStackNode next) {
            this.data = data;
            this.next = next;
        }
    }
    
    
    package com.java.model;
    
    public class LinkStack {
        //栈顶指针,也就是所谓的头结点
        public LinkStackNode head;
        //栈的容量
        public int size;
    
        public LinkStack(LinkStackNode head, int size) {
            this.head = head;
            this.size = size;
        }
    }
    
    

    2,写链栈的方法类LinkStackDao;

    包括入栈,出栈等方法;

    package com.java.dao;
    
    import com.java.model.LinkStack;
    import com.java.model.LinkStackNode;
    
    public class LinkStackDao {
        //初始化栈
        public LinkStack Init_LinkStack(){
            //初始化栈顶指针
            LinkStackNode head=new LinkStackNode(0,null);
            //初始化栈
            LinkStack stack=new LinkStack(head,0);
    
            return stack;
        }
    
        //入栈
        public void Push_LinkStack(LinkStack stack,Object data){
            if (stack == null){
                return;
            }
            if (data == null){
                return;
            }
            //创建新插入的结点,也就是栈顶指针后面的第一个元素,因为只能在栈顶进行元素插入或删除
            LinkStackNode newNode=new LinkStackNode(data,null);
            //进入插入操作
            newNode.next=stack.head.next;
            //栈顶指针的next等于新插入结点
            stack.head.next=newNode;
            //栈容量加1
            stack.size++;
        }
    
        //出栈
        public void Pop_LinkStack(LinkStack stack){
            if (stack == null){
                return;
            }
            if (stack.size == 0){
                return;
            }
            //删除栈顶指针后面的第一个元素
            stack.head.next=stack.head.next.next;
            //栈容量减1
            stack.size--;
        }
    
        //返回栈顶元素
        public Object Top_LinkStack(LinkStack stack){
            if (stack == null){
                return null;
            }
            if (stack.size == 0){
                return null;
            }
            //栈顶元素也就是栈顶指针后面的第一个元素
            return stack.head.next.data;
        }
    
        //返回栈容量,也就是栈元素个数
        public int Size_LinkStack(LinkStack stack){
            if (stack == null){
                return -1;
            }
            return stack.size;
        }
    
        //清空栈
        public void Clear_LinkStack(LinkStack stack){
            if (stack == null){
                return ;
            }
            stack.head.next=null;
            stack.size=0;
        }
    }
    
    

    3,主函数;

    主函数,包括测试链栈的方法;

    package com.java.main;
    
    import com.java.dao.LinkStackDao;
    import com.java.model.LinkStack;
    
    public class LinkStackMain {
        public static void main(String[] args) {
            LinkStackDao linkStackDao=new LinkStackDao();
            //初始化栈
            LinkStack stack=linkStackDao.Init_LinkStack();
    
            //入栈
            linkStackDao.Push_LinkStack(stack,"A");
            linkStackDao.Push_LinkStack(stack,"B");
            linkStackDao.Push_LinkStack(stack,"C");
            linkStackDao.Push_LinkStack(stack,"D");
            linkStackDao.Push_LinkStack(stack,"E");
    
            //输出栈元素
            while(stack.size>0){
                //查找栈顶元素
                Object o=linkStackDao.Top_LinkStack(stack);
                System.out.println(o);
                //出栈
                linkStackDao.Pop_LinkStack(stack);
            }
        }
    }
    
    

    运行结果:
    在这里插入图片描述

    好了,今天就分享到这里了,更多采用漫画趣解编程知识的文章,欢迎关注我的微信公众号,一起学习进步!嘿嘿~

    原创实属不易,求个关注吧

  • 相关阅读:
    Pandas高级教程之:category数据类型
    Pandas高级教程之:处理缺失数据
    Pandas高级教程之:处理text数据
    密码学系列之:blowfish对称密钥分组算法
    架构之:数据流架构
    ES6中的新特性:Iterables和iterators
    密码学系列之:feistel cipher
    Pandas高级教程之:Dataframe的重排和旋转
    Electron实用技巧-electron-builder中用户协议(license)的使用及多语言支持
    Electron实用技巧-开机启动时隐藏主窗口,只显示系统托盘
  • 原文地址:https://www.cnblogs.com/huke123/p/12395539.html
Copyright © 2011-2022 走看看