在上篇文章当中,我们实现了底层为数组的顺序栈。在我之前的文章中也提到过:以数组为数据结构基础在存储数据方面需要一整块连续的内存来存放数据,一旦遇到需要可以动态扩展的功能需求时如果数据量大可能会给虚拟机很大的压力导致频繁GC来获取足够大的内存块。现在,为了避免这种问题的发生,我们通过另外一种方式实现栈的功能来避免这种问题。

  首先我们定义定义Stack接口:

 package com.chen.arithmetic_test.stack_test;

 /**
* Created by ChenMP on 2017/7/4.
*/
public interface Stack {
//入栈
public void push(Object obj) throws Exception;
//出栈
public Object pop() throws Exception;
//获得栈顶元素
public Object getTop() throws Exception;
//判断栈是否为空
public boolean isEmpty();
}

  定义我们的节点元素类(当然,我们也可以将其定义为一个内部类):

 package com.chen.arithmetic_test.stack_test;

 /**
* Created by ChenMP on 2017/7/4.
*/
public class Node {
private Object nodeData; //该节点数据值
private Node footNode; //底部节点 public Node(Object nodeData) {
this.nodeData = nodeData;
} public Object getNodeData() {
return nodeData;
} public void setNodeData(Object nodeData) {
this.nodeData = nodeData;
} public Node getFootNode() {
return footNode;
} public void setFootNode(Node footNode) {
this.footNode = footNode;
} @Override
public String toString() {
return "Node{" +
"nodeData=" + nodeData +
'}';
}
}

  编写LinkStack类:

 package com.chen.arithmetic_test.stack_test;

 /**
* Created by ChenMP on 2017/7/4.
*/
public class LinkStack implements Stack {
private Node head; //栈顶元素
private int size; //栈大小
private int maxSize; //栈最大长度 public LinkStack() {
this.head = null;
this.size = 0;
this.maxSize = 10; //设置栈默认大小为10
} public LinkStack(int maxSize) {
this.head = null;
this.size = 0;
this.maxSize = maxSize;
} @Override
public void push(Object obj) throws Exception {
if (size == maxSize)
throw new Exception("堆栈已满!"); Node currentNode = new Node(obj);
currentNode.setFootNode(head);
this.head = currentNode;
size++;
} @Override
public Object pop() throws Exception {
if (0 == size)
throw new Exception("堆栈为空!"); Node currentNode = this.head;
head = currentNode.getFootNode();
size--;
return currentNode;
} @Override
public Object getTop() throws Exception {
if (0 == size)
throw new Exception("堆栈为空!"); return head;
} @Override
public boolean isEmpty() {
return size>0?false:true;
}
}

  编写我们的测试类:

 package com.chen.arithmetic_test.stack_test;

 import java.util.Scanner;

 /**
* Created by ChenMP on 2017/7/4.
*/
public class TestStack {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
LinkStack stack = new LinkStack(10); Scanner in = new Scanner(System.in);
int temp;
for(int i=0;i<10;i++)
{
System.out.println("请输入第"+(i+1)+"个整数:");
temp = in.nextInt();
stack.push(temp);
} while(!stack.isEmpty())
{
System.out.println(stack.pop());
}
}
}

  通过上面的代码,我们学习到了通过节点来实现我们自己的堆栈结构,其实在java.util.Stack中,它的实现便是使用了数组为底层来实现的。但是在学习知识的过程中,我们最好能学会举一反三,这样我们才能更好的进步,你说对不对?

[Java算法分析与设计]--链式堆栈的设计的更多相关文章

  1. 数据结构Java实现05----栈:顺序栈和链式堆栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  2. 数据结构Java实现03----栈:顺序栈和链式堆栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  3. java开发中的链式思维 —— 设计一个链式过滤器

    概述 最近在弄阿里云的sls日志服务,该服务提供了一个搜索接口,可根据各种运算.逻辑等表达式搜出想要的内容.具体语法可见https://help.aliyun.com/document_detail/ ...

  4. 【Java】子类的链式调用

    记录最近在项目设计中遇到的一个小问题. 前提:有这样两个POJO类,它们都可以通过链式调用的方式来设置其属性值,其中一个类继承了另一个类. 问题:通过链式调用,子类对象访问父类方法后,如何使返回对象仍 ...

  5. iOS开发技巧系列---使用链式编程和Block来实现UIAlertView

    UIAlertView是iOS开发过程中最常用的控件之一,是提醒用户做出选择最主要的工具.在iOS8及后来的系统中,苹果更推荐使用UIAlertController来代替UIAlertView.所以本 ...

  6. MySQL中间件之ProxySQL(11):链式规则( flagIN 和 flagOUT )

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.理解链式规则 在mysql_query_rules表中,有两个特殊 ...

  7. ProxySQL(11):链式规则( flagIN 和 flagOUT )

    文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9350631.html 理解链式规则 在mysql_query_rules表中,有两个特殊字段"fl ...

  8. Java bean 链式获取成员变量无需判空的工具设计

    Java bean 链式获取成员变量无需判空的工具设计 本篇文章已发布至公众号 Hollis 对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者 ...

  9. 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列

    一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...

随机推荐

  1. Android Proguard使用技巧

    1.混淆后解码 ProGuard运行结束后,输出以下文件: dump.txt :描述.apk文件中所有类文件间的内部结构 mapping.txt:列出了原始的类,方法和字段名与混淆后代码间的映射.这个 ...

  2. 用timer自定义计划任务时间

    应业务需求,需要将指定程序,按照指定时间进行运行, 而windows计划任务最小运行间隔时间为1分钟,完全不能满足当前需求, 有两种方案,一种是安装win服务方式,考滤到维护困难,另一种是timer方 ...

  3. Java并发案例05---Master-Worker模式

    Master-Worker 模式是常用的并行计算模式.它的核心思想是系统由两类进程协同工作,Master和Worker进程.Master负责接收和分配任务,Worker负责处理子任务.当各个Worke ...

  4. TensorFlow函数(二)tf.get_variable() 和 tf.Variable()

    tf.Variable(<initial - value>,name=<optional - name>) 此函数用于定义图变量.生成一个初始值为initial - value ...

  5. xss实现获取网站源码

    当网站cookie设置了httponly,xss获取不到到网站的cookie.但是我们是可以获取到网站后台的url. 这时候我们可以xss得到网站后台源码,从而找到网站后台的一些敏感操作:添加用户,删 ...

  6. PHP面试系列 之Linux(六)---- 面试题整理

    1.shell命令 top:查看有哪些系统进程正在运行.该命令提供了实时对系统处理器状态的监控,它能够实时显示系统中各个进程的资源占用情况.该命令可以按照对CPU.内存使用和执行时间对系统任务进程进行 ...

  7. 子查询 SQL

    SELECT *,(SELECT COUNT(*) FROM yd_order o WHERE FROM_UNIXTIME(o.`ctime`,'%Y-%m')='2016-06' AND o.uid ...

  8. PHP+JQUERY+AJAX上传、裁剪图片(2)

    <script type="text/javascript"> var imgCut = { imgOpt : { imgPrototypeId : 'imgProto ...

  9. 将form表单元素的值序列化成对象

    /**jQuery * 将form表单元素的值序列化成对象 * @returns object */ var serializeObject = function(form) { var o = {} ...

  10. Git创建本地分支并关联远程分支

    创建本地分支git branch 分支名 例如:git branch dev,这条命令是基于当前分支创建的本地分支,假设当前分支是master(远程分支),则是基于master分支创建的本地分支dev ...