欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

什么是栈?

程序员文章站 2024-02-29 12:18:16
...

写在前面:

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

思维导图

什么是栈?

什么是栈?

什么是栈?

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

栈的特性?

什么是栈?
什么是栈?
如图:什么是栈?

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

顺序栈和链栈

什么是栈?
什么是栈?

代码实现

顺序栈:

栈的顺序存储结构简称顺序栈;
利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素;
同时附设指针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);
        }
    }
}

运行结果:
什么是栈?

好了,今天就分享到这里了,更多采用漫画趣解编程知识的文章,欢迎关注我的微信公众号,一起学习进步!嘿嘿~
什么是栈?
原创实属不易,求个关注吧~