数据结构——Java实现链栈
一、分析
栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表。
链栈是指采用链式存储结构实现的栈,通常用单链表来表示,在单链表表头进行栈的操作。
一个标准的链栈具有如下的基本操作:
1、初始化链栈
2、销毁链栈
3、清空链栈
4、检测链栈是否为空
5、返回链栈中的元素个数
6、返回链栈的栈顶元素,不修改栈指针
7、向链栈顶压入元素
8、从链栈顶弹出元素
9、从栈底到栈顶遍历链栈
在Java中,我们可以将链栈中的每个结点统一定义成一个类,类中包含有“元素值”和“下一地址”两个属性。链栈的基本操作即为类的方法,每压入一个元素即生成一个结点对象。为了操作方便,我们附设一个头结点,头结点不存储值,它保存的是链栈的地址。这样,初始化链栈即生成头结点,销毁链栈即销毁头结点。
二、实现
1、定义类属性和构造函数
class InitStack{ private int [] data = new int[1]; //存储元素值 private InitStack nextStack; //存储下一地址 public InitStack() { //用于生成头结点
this.data = null;
this.nextStack = null;
} public InitStack(int data) { //用于生成链栈结点
this.data[0] = data;
this.nextStack = null;
}
}
2、清空链栈
public void clearStack() {
this.nextStack = null; //令头结点的下一地址为空,链栈即被清空
}
3、检测链栈是否为空
public boolean stackEmpty() {
if(this.nextStack == null) { //判断头结点的下一地址是否为空即可
return true;
}
return false;
}
4、返回链栈中的元素个数
public int stackLength() { InitStack theStack = this.nextStack; //获取头结点的下一地址即链栈的第一个结点
int i = 0; //初始化计数器 for (i = 0; theStack != null; i++) { //循环判断如不为空,则计数器加一
theStack = theStack.nextStack;
}
return i;
}
5、返回链栈的栈顶元素,不修改栈指针
public int [] getTop() { if(this.nextStack == null) { //判断是否为空栈
return null;
} return this.nextStack.data;
}
6、向链栈顶压入元素
public void push(int input) {
InitStack initStack = new InitStack(input);
initStack.nextStack = this.nextStack;
this.nextStack = initStack;
}
7、从链栈顶弹出元素
public int [] pop() { if (this.nextStack == null) { //判断栈是否为空
return null;
} int [] i = this.nextStack.data; //获取栈顶元素值
this.nextStack = this.nextStack.nextStack; //删除栈顶元素
return i;
}
8、从栈底到栈顶遍历链栈
public String stackTraverse() { //这里通过输出栈元素值来表示遍历 InitStack theStack = this.nextStack;
String s = ""; while(theStack != null) { //循环遍历栈
s = theStack.data[0] + "、" + s;
theStack = theStack.nextStack;
} if(s.length() == 0) { //如果未获得值,则直接输出空字符串
return s;
}
return s.substring(0,s.length() - 1); //除去最后的顿号后返回字符串
三、小结
以上就是链栈用Java的实现,由于只定义了整数的数组,因此只能操作整数数据,但链栈的基本思想都已实现。
四、纠正
隔了一段时间又回来看代码,猛地发现这段代码其实还不够完善。(⊙x⊙;)
将链栈的基本操作定义成了InitStack类的方法,实例化结点时,会使每个结点都拥有这些方法,然而其实只有头结点需要这些方法,其他结点都不需要。
因此可以将InitStack类定义成头节点类,而其他节点定义成头节点的内部类,这样,就只有头节点可以操作其他节点。
由于要修改的地方太多,这里我就不修改了,放在这里提醒自己。(就是因为懒……(><))
数据结构——Java实现链栈的更多相关文章
- java使用链栈实现迷宫求解
java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html java实现链栈的代码: package stackapplicatio ...
- java使用链栈实现数制转换
java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html 将前面java实现链栈的代码稍作修改: package linkedst ...
- java与数据结构(6)---java实现链栈
栈之链式存储结构链栈 链栈 栈的链式存储结构成为链栈.链栈是没有头结点,头结点就是栈顶指针top. 代码结构 package list; public interface Stackable;公共接口 ...
- 数据结构——Java实现顺序栈
一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 顺序栈是指利用顺序存储结构实现 ...
- java实现链栈
package linkstack; /** * Created by Administrator on 2019/4/18. */ public class LinkStack { private ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- 【C#】【数据结构】006-栈:链栈
C#数据结构:链栈 1.自定义链栈结构: 链栈节点类 using System.Collections; using System.Collections.Generic; using UnityEn ...
- 数据结构 - 链栈的实行(C语言)
数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它 ...
- java实现 数据结构:链表、 栈、 队列、优先级队列、哈希表
java实现 数据结构:链表. 栈. 队列.优先级队列.哈希表 数据结构javavector工作importlist 最近在准备找工作的事情,就复习了一下java.翻了一下书和网上的教材,发现虽然 ...
随机推荐
- Eureka的功能特性及相关配置
1.服务提供者1.1服务注册服务提供者启动时,会通过rest请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息.Eureka Server接收到请求后,将元数据信息 ...
- 用Python学分析 - 二项分布
二项分布(Binomial Distribution)对Bernoulli试验序列的n次序列,结局A出现的次数x的概率分布服从二项分布- 两分类变量并非一定会服从二项分布- 模拟伯努利试验中n次独立的 ...
- Linux中以单容器部署Nginx+ASP.NET Core
引言 正如前文提到的,强烈推荐在生产环境中使用反向代理服务器转发请求到Kestrel Http服务器,本文将会实践将Nginx --->ASP.NET Core 部署架构容器化的过程. Ng ...
- 如何扩展分布式日志组件(Exceptionless)的Webhook事件通知类型?
写在前面 从上一篇博客高并发.低延迟之C#玩转CPU高速缓存(附示例)到现在又有几个月没写博客了,啥也不说,变得越来越懒了,懒惰产生了拖延后遗症. 最近一周升级了微服务项目使用的分布式日志组件Exce ...
- 使用强类型实体Id来避免原始类型困扰(一)
原文地址:https://andrewlock.net/using-strongly-typed-entity-ids-to-avoid-primitive-obsession-part-1/ 作者: ...
- 前端 SPA 单页应用数据统计解决方案 (ReactJS / VueJS)
前端 SPA 单页应用数据统计解决方案 (ReactJS / VueJS) 一.百度统计的代码: UV PV 统计方式可能存在问题 在 SPA 的前端项目中 数据统计,往往就是一个比较麻烦的事情,Re ...
- Android版数据结构与算法(五):LinkedHashMap核心源码彻底分析
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 上一篇基于哈希表实现HashMap核心源码彻底分析 分析了HashMap的源码,主要分析了扩容机制,如果感兴趣的可以去看看,扩容机制那几行最难懂的 ...
- Java 泛型完全解读
对于泛型的使用我想大家都非常熟悉,但是对于类型擦除,边界拓展等细节问题,可能不是很清楚,所以本文会重点讲解一下:另外对泛型的了解其实可以看出,一个语言特性的产生逻辑,这对我们平时的开发也是非常有帮助的 ...
- 程序员如何巧用Excel提高工作效率 第二篇
之前写了一篇博客程序员如何巧用Excel提高工作效率,讲解了程序员在日常工作中如何利用Excel来提高工作效率,没想到收到很好的反馈,点赞量,评论量以及阅读量一度飙升为我的博客中Top 1,看来大家平 ...
- 折腾Java设计模式之解释器模式
解释器模式 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 意图 给定一个语言,定义它的文法表 ...