[Java算法分析与设计]--链式堆栈的设计
在上篇文章当中,我们实现了底层为数组的顺序栈。在我之前的文章中也提到过:以数组为数据结构基础在存储数据方面需要一整块连续的内存来存放数据,一旦遇到需要可以动态扩展的功能需求时如果数据量大可能会给虚拟机很大的压力导致频繁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算法分析与设计]--链式堆栈的设计的更多相关文章
- 数据结构Java实现05----栈:顺序栈和链式堆栈
一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- 数据结构Java实现03----栈:顺序栈和链式堆栈
一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- java开发中的链式思维 —— 设计一个链式过滤器
概述 最近在弄阿里云的sls日志服务,该服务提供了一个搜索接口,可根据各种运算.逻辑等表达式搜出想要的内容.具体语法可见https://help.aliyun.com/document_detail/ ...
- 【Java】子类的链式调用
记录最近在项目设计中遇到的一个小问题. 前提:有这样两个POJO类,它们都可以通过链式调用的方式来设置其属性值,其中一个类继承了另一个类. 问题:通过链式调用,子类对象访问父类方法后,如何使返回对象仍 ...
- iOS开发技巧系列---使用链式编程和Block来实现UIAlertView
UIAlertView是iOS开发过程中最常用的控件之一,是提醒用户做出选择最主要的工具.在iOS8及后来的系统中,苹果更推荐使用UIAlertController来代替UIAlertView.所以本 ...
- MySQL中间件之ProxySQL(11):链式规则( flagIN 和 flagOUT )
返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.理解链式规则 在mysql_query_rules表中,有两个特殊 ...
- ProxySQL(11):链式规则( flagIN 和 flagOUT )
文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9350631.html 理解链式规则 在mysql_query_rules表中,有两个特殊字段"fl ...
- Java bean 链式获取成员变量无需判空的工具设计
Java bean 链式获取成员变量无需判空的工具设计 本篇文章已发布至公众号 Hollis 对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者 ...
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
随机推荐
- 乘风破浪:LeetCode真题_010_Regular Expression Matching
乘风破浪:LeetCode真题_010_Regular Expression Matching 一.前言 关于正则表达式我们使用得非常多,但是如果让我们自己写一个,却是有非常大的困难的,我们可能想到状 ...
- LVS跨网段DR模式并使用ldirectord实现RS高可用性
DR模型的工作过程: Client向VIP发起请求,请求被路由器接收到,转发给不同网段的Director的VIP,Director再通过私有网络转给RS服务器,RS服务器处理请求并通过自身配置的VIP ...
- Discuz的一处越权操作,强制回复无权限帖子
合购vip 等教程论坛 都用的是Discuz 看操作步骤: 随便找一处vip教程 接下来 我们审查元素 找到这段代码 然后修改 <a href="http://xxx.xxx.xx ...
- https nginx 设置
https://www.digitalocean.com/community/tutorials/how-to-create-an-ssl-certificate-on-nginx-for-ubunt ...
- Asp.net & Aspose.cells 导入
Workbook workBook = new Workbook(this.fuFile.FileContent); Aspose.Cells.Worksheet sheet = workBook.W ...
- JS实现图片上传之前先预览
<html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat=&quo ...
- gluoncv 训练自己的数据集,进行目标检测
跑了一晚上的模型,实在占GPU资源,这两天已经有很多小朋友说我了.我选择了其中一个参数. https://github.com/dmlc/gluon-cv/blob/master/scripts/de ...
- gluoncv 用已经训练好的模型参数,检测物体
当然这个模型参数,最好用自己的,否则不够精确,我自己的还没训练完. from matplotlib import pyplot as plt import gluoncv from gluoncv i ...
- 【[HEOI2016/TJOI2016]字符串】
码农题啊 上来先无脑一个\(SA\)的板子,求出\(SA\)和\(het\)数组 我们只需要从\(sa[i]\in[a,b]\)的所有\(i\)中找到一个\(i\)使得\(sa[i]\)和\(rk[c ...
- 【[SDOI2014]数表】
求 \[\sum_{i=1}^N\sum_{j=1}^Mσ(gcd(i,j))[σ(gcd(i,j))<=a]\] \(σ\)表示约数和函数 感觉非常难求的样子 先把套路搞出来 \[f(n)=\ ...