一、分析

  栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表。

  链栈是指采用链式存储结构实现的栈,通常用单链表来表示,在单链表表头进行栈的操作。

  一个标准的链栈具有如下的基本操作:

    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实现链栈的更多相关文章

  1. java使用链栈实现迷宫求解

    java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html java实现链栈的代码: package stackapplicatio ...

  2. java使用链栈实现数制转换

    java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html 将前面java实现链栈的代码稍作修改: package linkedst ...

  3. java与数据结构(6)---java实现链栈

    栈之链式存储结构链栈 链栈 栈的链式存储结构成为链栈.链栈是没有头结点,头结点就是栈顶指针top. 代码结构 package list; public interface Stackable;公共接口 ...

  4. 数据结构——Java实现顺序栈

    一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 顺序栈是指利用顺序存储结构实现 ...

  5. java实现链栈

    package linkstack; /** * Created by Administrator on 2019/4/18. */ public class LinkStack { private ...

  6. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  7. 【C#】【数据结构】006-栈:链栈

    C#数据结构:链栈 1.自定义链栈结构: 链栈节点类 using System.Collections; using System.Collections.Generic; using UnityEn ...

  8. 数据结构 - 链栈的实行(C语言)

    数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它 ...

  9. java实现 数据结构:链表、 栈、 队列、优先级队列、哈希表

    java实现 数据结构:链表. 栈. 队列.优先级队列.哈希表   数据结构javavector工作importlist 最近在准备找工作的事情,就复习了一下java.翻了一下书和网上的教材,发现虽然 ...

随机推荐

  1. MySQL - 扩展性 3 负载均衡:眼花缭乱迷人眼

    负载均衡的基本思路很简单: 在一个服务器集群中尽可能地的平均负载量. 基于这个思路,我们通常的做法是在服务器前端设置一个负载均衡器.负载均衡器的作用是将请求的连接路由到最空闲的可用服务器上.如图 1, ...

  2. Linux - 修改系统的max open files、max user processes (附ulimit的使用方法)

    目录 1 问题说明 2 修改max open files 3 修改max user processes 4 附录: ulimit命令说明 1 问题说明 Linux 系统默认的max open file ...

  3. 『神坑』DotNetty 内存泄漏 解决办法

    背景 近来在用 DotNetty 实现一个文件上传下载的同步服务. 其中:客户端下载服务端的文件,客户端多次请求,从服务端将文件分片下载下来,追加到本地磁盘. —— 非常简单的代码,都写了几十次了,驾 ...

  4. 讲解:为什么重写equals时必须重写hashCode方法

    一 :string类型的==和equals的区别: 结论:"=="是判断两个字符串的内存地址是否相等,equals是比较两个字符串的值是否相等,具体就不做扩展了,有兴趣的同学可以去 ...

  5. cshtml中正则表达式使用后台代码

    //定义变量 bool a = false; //正则表达式 string b = @" ^ (13[0 - 9] | 14[5 | 7] | 15[0 | 1 | 2 | 3 | 5 | ...

  6. 个人整理的 Windows 下 .NET 开发必装的软件

    注: 最后更新时间:2019-03-15 一..NET 开发 1. 必装 软件名称 说明 下载地址 JetBrains Toolbox JetBrins 全家桶管理工具. 下载地址 JetBrains ...

  7. Web前端 前端工程师首选的几款编辑器/IDE以及Markdown的编辑器、语法

    前端工程师常使用的编辑器/IDE 本地在线工具 webstrom 推荐指数 ***** vs code 推荐指数 **** atom 推荐指数 **** subline-text 推荐指数 **** ...

  8. Node.js 事件循环机制

    Node.js 采用事件驱动和异步 I/O 的方式,实现了一个单线程.高并发的 JavaScript 运行时环境,而单线程就意味着同一时间只能做一件事,那么 Node.js 如何通过单线程来实现高并发 ...

  9. IoC和AOP的理解

    spring 的优点?1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实 ...

  10. 经典排序算法 — C#版本(中)

    归并排序比较适合大规模得数据排序,借鉴了分治思想. 归并排序原理 自古以来,分久必合合久必分. 我们可以这样理解归并排序,分-分到不能分为止,然后合并. 使用递归将问题一点一点分解,最后进行合并. 分 ...