java顺序栈和链栈_Java的顺序栈和链式栈

栈的定义

栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入、删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈。

通常删除(又称“退栈”)叫做弹出pop操作,每次删除的都是栈顶最新的元素;每次插入(又称“进栈”)称为压入push操作。

当栈满的时候,进行push 操作,会上溢,当空栈的时候进行退栈操作的时称为下溢。

上溢是一种出错的情况,下溢可能是正常的情况处理。

堆栈的运算是按照后进先出的原则,简称LIFO。

栈的基本运算定义:

initStack:构造一个空栈;

stackEmpty:判断是否为空;

stackFUll:判断是否栈满;

push:进栈,将该元素压入栈顶;

pop:退栈,弹出栈顶元素,注意非空判断;

stackTop:去除栈顶元素,不改变指针。

做个简单的Stack接口:

package com.wuwii.utils;

/**

* 堆栈

* @author Zhang Kai

* @version 1.0

* @since

2017/12/14 22:51

*/

public interface Stack {

/**

* 进栈

*

* @param element 进栈的元素

*/

void push(E element);

/**

* 弹出栈顶元素 ,并改变指针

*

* @return 栈顶元素

*/

E pop();

/**

* 返回栈顶元素 ,不改变指针

*

* @return 栈顶元素

*/

E topElement();

/**

* 判断是否为空栈

*

* @return true为空栈

*/

Boolean isEmpty();

/**

* 清空栈

*/

void clear();

}

顺序栈

就是符合LIFO运算规则的顺序线性表。

package com.wuwii.utils;

/**

* 顺序栈

* @author Zhang Kai

* @version 1.0

* @since

2017/12/14 23:05

*/

public class ArrayStack implements Stack {

/**

* 初始化栈的默认大小

*/

private final int defaultSize = 10;

/**

* 栈的集合大小

*/

private int size;

/**

* 栈顶的位置

*/

private int top;

/**

* 元素存储在数组

*/

private Object[] elements;

/**

* 初始化默认大小为10 的栈

*/

public ArrayStack() {

initStack(defaultSize);

}

/**

* 初始化指定大小的栈

* @param givenSize 指定栈大小

*/

public ArrayStack(Integer givenSize) {

initStack(givenSize);

}

/**

* 初始化栈

* @param givenSize 给定的栈大小

*/

private void initStack(Integer givenSize) {

size = givenSize;

top = 0;

elements = new Object[size];

}

/**

* 清空栈

*/

@Override

public void clear() {

top = 0;

}

/**

* 进栈

* @param element 进栈的元素

*/

@Override

public void push(E element) {

sizeCheckForPush();

elements[top++] = element;

}

/**

* 弹出栈顶元素 ,并改变指针

* @return 栈顶元素

*/

@Override

public E pop() {

sizeCheckForPop();

return (E) elements[--top];

}

/**

* 返回栈顶元素 ,不改变指针

* @return 栈顶元素

*/

@Override

public E topElement() {

sizeCheckForPush();

return (E) elements[top - 1];

}

/**

* 判断是否为空栈

* @return true为空栈

*/

@Override

public Boolean isEmpty() {

return size == 0;

}

/**

* 在进栈的时候检查

*/

private void sizeCheckForPush() {

if (top >= size) {

throw new RuntimeException("Stack overflow");

}

}

/**

* 退栈检查

*/

private void sizeCheckForPop() {

if (isEmpty()) {

throw new RuntimeException("Stack is empty");

}

}

}

链式栈

符合LIFO运算规则的链式线性表。

package com.wuwii.utils;

/**

* @author Zhang Kai

* @version 1.0

* @since

2017/12/15 12:58

*/

public class LinkStack implements Stack {

/**

* 链式单元

*/

private Node top;

/**

* 初始化链式堆栈

*/

public LinkStack() {

initStack();

}

/**

* 初始化

*/

private void initStack() {

top = null;

}

/**

* 存储单元

*/

private static class Node {

E element;

Node next;

Node(E element, Node next) {

this.element = element;

this.next = next;

}

}

/**

* 进栈

*

* @param element 进栈的元素

*/

@Override

public void push(E element) {

top = new Node(element, top);

}

/**

* 弹出栈顶元素 ,并改变指针

*

* @return 栈顶元素

*/

@Override

public E pop() {

checkEmpty();

E element = top.element;

top = top.next;

return element;

}

/**

* 返回栈顶元素 ,不改变指针

*

* @return 栈顶元素

*/

@Override

public E topElement() {

checkEmpty();

return top.element;

}

/**

* 判断是否为空栈

*

* @return true为空栈

*/

@Override

public Boolean isEmpty() {

return top == null;

}

/**

* 清空栈

*/

@Override

public void clear() {

if (isEmpty()) {

return;

}

for (Node x = top; x != null; ) {

Node next = x.next;

x.element = null;

x.next = null;

x = next;

}

size = 0;

}

/**

* 检查链式堆栈是否为空,为空抛出异常

*/

private void checkEmpty() {

if (isEmpty()) {

throw new RuntimeException("LinkStack is empty");

}

}

}

首先push 修改新产生的链表节点的next 域并指向栈顶,然后设置top 指向新的链表节点,pop则相反。

顺序栈和链式栈的比较

实现链式栈和顺序栈的操作都是需要常数时间,时间复杂度为O(1),主要从空间和时间复杂度考虑。

顺序栈初始化的时候必须要给定指定大小,当堆栈不满的时候,会造成一部分的空间浪费,链式栈变长,相对节约空间,但是增加了指针域,额外加大了数据结构的开销。

当需要多个堆栈共享的时候,顺序存储中可以充分的利用顺序栈的单向延伸,将一个数组可以存在两个堆栈里,每个堆栈从各自的栈顶出发延伸,这样减少了空间的浪费。但只有两个为堆栈的空间有相反的需求的时候才能使用。就是最好一个堆栈只能增加,一个只能减少。如果,两个一起增加,可能造成堆栈的溢出。

如果在多个顺序堆栈共享空间,一个堆栈满了,其他可能没满,需要使用堆栈的LIFO 运算法则,将满的堆栈元素向左或者右进行平移操作,这样会造成大量的数据元素移动,使得时间的开销增大。

相对来说,使用两个堆栈共享一个空间是比较适宜的存储方式,但是也增加了堆栈溢出的危险。

由于链式存储结构的不连续性,什么时候需要,就什么时候去存储,不存在溢出的问题,但是增加了结构的开销,总体上来说浪费了空间,但是不需要堆栈共享,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java:ChronicleMap第2部分,超级RAM映射

诸如无处不在的HashMap类的标准Java Map最终受到可用RAM的限制。 阅读本文并了解如何创建几乎无限大小甚至超过目标计算机的RAM大小的Java Map。 内置的Map实现,例如HashMap和ConcurrentHashMap ,只要它们相对较小,就可以正常工作。 在所有情…

jsp中的java部分_jsp页面的七个组成部分

jsp页面的七个组成部分1. 静态内容:前端内容一行一行翻译成 out.write(“前端内容”);2. 指令: 第一个指令是pagepage指令的第一个标准用法,告诉servlet容器,这是一个jsp页面pageEncoding 指…

java多线程做一件事_关于Java的十件事

java多线程做一件事那么,您从一开始就一直在使用Java? 还记得那些被称为“ Oak”的日子,OO仍然是热门话题,C 人士认为Java没有机会,Applet还是一件事吗? 我敢打赌,您至少不了解以下一半内容。 …

java第二章复习_JAVA第二章知识点

JAVA第二章知识点本章知识梳理2.1 关键字2.2 标识符2.3 变 量2.4运算符2.5 程序流程控制2.6 方法2.1 关键字关键字(keyword)的定义和特点定义:被java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中所有字母都为小写保留字(rese…

打造大型直播平台之《PC客户端架构》

今晚课题点击【阅读原文】或长按图片【识别图中的二维码】即可参加今晚的课程。

Java中的装饰器设计模式

装饰器设计模式允许在运行时将附加职责或行为动态附加到对象。 它是一种结构模式,利用聚合来组合这些行为。 在本教程中,我们将学习实现装饰器模式。 UML图: 让我们从装饰器模式的UML表示开始: ConcreteComponent类是我们希望为…

冲击波病毒攻击-《截获网站服务器数据》

今晚课题点击【阅读原文】或长按图片【识别图中的二维码】即可

java版 modbus crc16校验 (已测试成功)_java版 ModBus CRC16校验 (已测试成功)

ModBus 的Crc16校验package testCase;public class CRC16M {static final String HEXES "0123456789ABCDEF";byte uchCRCHi (byte) 0xFF;byte uchCRCLo (byte) 0xFF;private static byte[] auchCRCHi { 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x0…

用户控件 自定义控件_新的自定义控件:TaskProgressView

用户控件 自定义控件我已经编写了一个新的自定义控件,并将其提交到ControlsFX项目。 这是一个高度专业的控件,用于显示后台任务,其当前状态和进度的列表。 这实际上是我为ControlsFX编写的第一个控件,只是出于乐趣的考虑&#xff…

C/C++码农到工程师进化之路

今晚课题长按图片【识别图中的二维码】

java菜鸟到cto 图_从菜鸟到入门,掌握 Log4j

1 简介Log4j(log for java)是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式&a…

Java中的复合设计模式

当我们必须使用对象的树状分层结构时,复合设计模式非常有用。 它使我们能够统一对待单个对象和对象的组成。 它属于结构设计模式的范畴,因为它将对象组合成树形结构以表示部分整个层次结构。 UML表示形式: 复合模式的UML表示形式如下&#…

腾讯官方游戏《陆战之王 3D坦克大战》

今晚课题长按图片【识别图中的二维码】

hazelcast入门教程_Hazelcast入门指南第4部分

hazelcast入门教程这是我的Hazelcast系列的第四部分。 如果一个人没有看到其他三个人,我建议一个人去看第1 部分 , 第2 部分和第3部分 。 记录中 日志记录是任何应用程序的重要功能,我的示例也是如此。 System.out.println可以用作告诉用户控…

《地下城与勇士歼灭贝内尔》回合格斗

今晚课题长按图片【识别图中的二维码】

java继承执行子类输出顺序_JAVA继承顺序

当使用继承这个特性时,程序是如何执行的;继承的初始化顺序1.初始化父类再初始子类2.先执行初始化对象中属性,再执行构造方法中的初始化当使用继承这个特性时,程序是如何执行的呢,也就是说我们需要关注继承的初始化顺序…

空字符串字符串不为空_当字符串为空但不为空时

空字符串字符串不为空介绍 我团队中的一名初级程序员遇到了一个有趣的错误。 我已经不止一次看到它的症状。 这篇文章是寻找什么以及如何在将来防止它。 我还将探讨该问题的不同解决方案。 病征 有问题的代码看起来做得不错。: if(trouble ! null && !tro…

网络通信协议-TCP/IP模型实战

今晚课题长按图片【识别图中的二维码】

java家具网站需求分析_基于jsp的家具销售-JavaEE实现家具销售 - java项目源码

基于jspservletpojomysql实现一个javaee/javaweb的家具销售, 该项目可用各类java课程设计大作业中, 家具销售的系统架构分为前后台两部分, 最终实现在线上进行家具销售各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类家具销售相关的实体进行管理。该家具…

hazelcast入门教程_Hazelcast入门指南第2部分

hazelcast入门教程本文是我开始使用Hazelcast (分布式内存数据库)的系列文章的继续。 如果尚未阅读第一篇文章,请单击此处 。 分布式馆藏 Hazelcast具有许多可用于存储数据的分布式集合。 以下是它们的列表: 清单 我设置 队列…