漫画趣解——什么是栈?

写在前面:

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

思维导图

在这里插入图片描述

什么是栈?

在这里插入图片描述

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

栈的特性?

在这里插入图片描述

如图:

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

顺序栈和链栈


代码实现

顺序栈:

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

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

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

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

猜你喜欢

转载自www.cnblogs.com/huke123/p/12395539.html