栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

  

  从上图是基于数组实现的栈,可以看到,对栈的操作(压栈、出栈)其实都是对栈顶元素的操作,因此压栈和出栈的速度都比较快。栈中元素按照FILO顺序排序的,即先入后出的规则,先放进去的元素最后才能被弹出来。

  一、栈结构要素

  1、栈,是用来存储数据的数据结构,可以使用数组或链表来实现栈结构

  2、栈顶,顾名思义栈最顶部的元素,压栈与出栈的对象

  3、栈深度,栈中数据多少,如果栈结构为数组,当栈长度大于等于数组长度后,会抛出异常或对数组进行扩容,栈结构是链表就没有这个限制。

  

//存放数据
private Object[] data;
//数据量
private int size;
//栈顶
private int top;
//默认栈大小
private static final int DEFAULT_INITIAL_CAPACITY = << ;
//最大容量
private int maxCapacity;

  

  二、压栈

    /**
* 向栈中放数据
* @param obj
* @return
*/
public boolean push(Object obj){
if (size >= maxCapacity) return false;
data[++top] = obj;
size++;
return true;
}

  压栈操作比较简单,将新元素放在原栈顶的上面,栈顶指针往上移动一位。我这里当栈深度等于数组长度后是直接返回false的,当然根据实际的需求,你也可以对现有数组进行扩容,然后将原栈中元素放入新栈中即可。如:

     /**
* 压栈,如果栈深度超出数组长度,将数组扩大1.5倍
* @param obj
* @return
*/
public boolean push1(Object obj){
if (size >= maxCapacity){
maxCapacity = maxCapacity * / ;
Object[] newStack = new Object[maxCapacity];
System.arraycopy(data,,newStack,,size);
Arrays.fill(data,null);
data = newStack;
}
data[++top] = obj;
size++;
return true;
}

  三、出栈

    /**
* 从栈中弹出数据
* @return
*/
public Object pop(){
if (size <= ) return null;
size--;
Object old = data[top];
data[top--] = null;
return old;
}

  出栈操作将栈顶元素掷为null,然后将栈顶指针往下移动一位即可,很简单。

  四、查看栈顶

    /**
* 查看数据
*/
public Object peek(){
if (isEmpty()) return null;
return data[top];
}

  这个方法更是简单到令人发指,只是查看栈顶元素,并没有将栈顶元素删除。

  五、清空栈

    /**
* 清空栈数据
*/
public void clear(){
while (top > -){
data[top--] = null;
}
size = ;
}

  栈数据结构的实现基本已经讲完了,栈的基本操作差不多包包含在里面了,代码实现起来就是这么简单。另外,另一种基于链表的栈我就不再这里说了,因为也是很简单的,这是栈限定对链表的操作只能是操作链表头部,大家如果感兴趣的话可以自己尝试用链表实现一个栈,或者可以参考一下我之前写的基于链表实现的队列,原理是差不多的,也可以参考一下jdk中的LinkedList。

  

深入理解Java 栈数据结构的更多相关文章

  1. java 16 - 5 LinkedList模拟栈数据结构的集合

    请用LinkedList模拟栈数据结构的集合,并测试 题目的意思是: 你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟. package cn_LinkedList; impo ...

  2. Java基础知识强化之集合框架笔记29:使用LinkedList实现栈数据结构的集合代码(面试题)

    1. 请用LinkedList模拟栈数据结构的集合,并测试:  题目的意思是:     你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟,使用LinkedList功能方法封装成 ...

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

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

  4. 深入理解Java内存模型中的虚拟机栈

    深入理解Java内存模型中的虚拟机栈 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都会有各自的用途,以及创建和销毁的时间,有的区域会随着虚拟机进程的启 ...

  5. 【转】深入理解 Java 垃圾回收机制

    深入理解 Java 垃圾回收机制   一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...

  6. 深入理解java垃圾回收机制

    深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...

  7. 深入理解java虚拟机(4)---类加载机制

    类加载的过程包括: 加载class到内存,数据校验,转换和解析,初始化,使用using和卸载unloading过程. 除了解析阶段,其他过程的顺序是固定的.解析可以放在初始化之后,目的就是为了支持动态 ...

  8. 深入理解java虚拟机系列(一):java内存区域与内存溢出异常

    文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...

  9. 深入理解Java虚拟机--中

    深入理解Java虚拟机--中 第6章 类文件结构 6.2 无关性的基石 无关性的基石:有许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码(ByteCode),从而 ...

随机推荐

  1. Java中常用的数据结构类

    结构体系图 List ArrayList.LinkedList.Vector有什么区别? ArrayList 只能装入引用对象(基本类型要转换为封装类): 线程不安全: 底层由数组实现(顺序表),因为 ...

  2. CDN公共资源

    SAE: http://lib.sinaapp.com/ Google: https://developers.google.com/speed/libraries/devguide?hl=zh-CN ...

  3. ZAB协议(Zookeeper atomic Broadcast)

    一.简语: ZAB协议是Paxos算法的经典实现 二.ZAB协议的两种模式: 崩溃恢复: 1.每个server都有一张选票(myid,zxid),选票投给自己 2.收集所有server的投票 3.比较 ...

  4. php添加日志文件

    记录一下. 有时候写测试代码的时候,不习惯直接在屏幕上输出反馈,那么可以配置日志文件,把需要输出的内容追加到日志文件里面,就很方便. Php自带日志系统,可以参考网上的博客配置. 我要说的是,如果你的 ...

  5. 基于Python的数据分析(3):文件和时间

    在接下来的章节中,我会重点介绍一下我自己写的基于之前做python数据分析的打包接口文件common_lib,可以认为是专用于python的第三方支持库.common_lib目前包括文件操作.时间操作 ...

  6. SSM框架下声明式事务管理(注解配置方式)

    一.spring-mybatis.xml文件中加入事务管理配置 <?xml version="1.0" encoding="UTF-8"?> < ...

  7. DevOps之三 Git的安装与配置

    Centos7 安装Git 一.卸载Centos7 自带的git # git --version git version 1.8.3.1# whereis gitgit: /usr/bin/git / ...

  8. RabbitMQ在windows系统安装部署文档

    1.RabbitMQ简介 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它 ...

  9. 最近面了不少java开发,据此来说下我的感受:哪怕事先只准备1小时,成功概率也能大大提升

    本人最近几年一直在做java后端方面的技术面试官,而在最近两周,又密集了面试了一些java初级和高级开发的候选人,在面试过程中,我自认为比较慎重,遇到问题回答不好的候选人,我总会再三从不同方面提问,只 ...

  10. Arduino初学

    常见关键字 声明变量及接口名称(int val;int ledPin=13;) setup()--函数在程序开始时使用,可以初始化变量.接口模式.启用库等(例如:pinMode(ledPin,OUTU ...