数据结构——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.翻了一下书和网上的教材,发现虽然 ... 
随机推荐
- 华为云(ECS)-linux服务器中-Ubuntu图形界面安装-解决root登录受限-VNCviwer/Teamviwer远程访问教程
			安装ubuntu-desktop .更新软件库 apt-get update .升级软件 apt-get upgrade .安装桌面 apt-get install ubuntu-desktop 解决 ... 
- 开发人员必备工具 —— JMeter 压测
			在接口开发完以后,开发人员应该学会对自己的接口先进行压测一下,虽然压测的结果并不一定准确,也不能完全反映真实情况,但是如果有问题的话多少是可以看出的,而且也可以及早做优化,做到心里有底.否则,等测试进 ... 
- ASP.NET Core中使用GraphQL - 最终章  Data Loader
			ASP.NET Core中使用GraphQL - 目录 ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间 ... 
- entity cannot be tracked
			背景:EF Core项目中使用InMemory作为数据库提供程序,编写单元测试. 报错:“The instance of entity type 'Movie' cannot be tracked b ... 
- [转载] Java中枚举类型的使用 - enum
			目录 1 枚举类的编译特性 2 向枚举类中添加方法 3 接口内部创建枚举 4 枚举类中使用枚举 5 扩展: 验证values()不是通过父类继承的 本文转载自博客 - Java枚举类型, 博主对原文内 ... 
- SQL Server的Linked Server支持使用SEQUENCE吗?
			SQL Server的Linked Server支持使用SEQUENCE吗? SQL Server 2012开始支持序列(SEQUENCE),今天遇到有个同事咨询,能否在LINKED SERVER ... 
- MSSQL2008 R2 数据库展开报错:值不能为空 参数名:viewInfo
			打开数据库时报错,提示应用程序组件中发生了无法处理的异常.如果单击“继续”,应用程序将忽略此错误并尝试继续. 针对此类问题的解决办法是:将路径C:\Documentsand Settings\Admi ... 
- Windows Server 2016-Powershell新建用户补充
			前边我们介绍到Windows Server 2016-图形化新建域用户(一) 及 Windows Server 2016-批量新建域用户(二) ,里边提到了批量通过new-aduser常见帐号,这里简 ... 
- windows之如何把文件夹转换成iso文件
			(1)oscdimg下载路径: 链接:https://pan.baidu.com/s/1U_SfamsOvI2nav9odAzujQ提取码:21fr (2)以管理员身份运行cmd命令: Oscdimg ... 
- kubernetes实战之运行aspnetcore webapi微服务 - kubernetes
			1.预备工作 unbuntu 16.04 or above docker for linux kubernetes for linux 集群环境 2.使用vs2017创建一个web api应用程序,并 ... 
