本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点:

栈的抽象数据类型

栈是一种用于存储数据的简单数据结构,有点类似链表或者顺序表(统称线性表),栈与线性表的最大区别是数据的存取的操作,我们可以这样认为栈(Stack)是一种特殊的线性表,其插入和删除操作只允许在线性表的一端进行,一般而言,把允许操作的一端称为栈顶(Top),不可操作的一端称为栈底(Bottom),同时把插入元素的操作称为入栈(Push),删除元素的操作称为出栈(Pop)。若栈中没有任何元素,则称为空栈,栈的结构如下图:

由图我们可看成栈只能从栈顶存取元素,同时先进入的元素反而是后出,而栈顶永远指向栈内最顶部的元素。到此可以给出栈的正式定义:栈(Stack)是一种有序特殊的线性表,只能在表的一端(称为栈顶,top,总是指向栈顶元素)执行插入和删除操作,最后插入的元素将第一个被删除,因此栈也称为后进先出(Last In First Out,LIFO)或先进后出(First In Last Out FILO)的线性表。栈的基本操作创建栈,判空,入栈,出栈,获取栈顶元素等,注意栈不支持对指定位置进行删除,插入,其接口Stack声明如下:

packagecom.spring.test;/*** 栈接口抽象数据类型*/

public interface Stack{/*** 栈是否为空

*@return

*/

booleanisEmpty();/*** data元素入栈

*@paramdata*/

voidpush(T data);/*** 返回栈顶元素,未出栈

*@return

*/T peek();/*** 出栈,返回栈顶元素,同时从栈中移除该元素

*@return

*/T pop();

}

packagecom.spring.test;importjava.io.Serializable;importjava.util.EmptyStackException;/*** Created by Administrator on 2018/3/9.*/

public class SeqStack implements Stack,Serializable {private static final long serialVersionUID = -5413303117698554397L;/*** 栈顶指针,-1代表空栈*/

private int top=-1;/*** 容量大小默认为10*/

private int capacity=10;/*** 存放元素的数组*/

privateT[] array;private intsize;public SeqStack(intcapacity){

array= (T[]) newObject[capacity];

}publicSeqStack(){

array= (T[]) new Object[this.capacity];

}public intsize(){returnsize;

}

@Overridepublic booleanisEmpty() {return this.top==-1;

}/*** 添加元素,从栈顶(数组尾部)插入

*@paramdata*/@Overridepublic voidpush(T data) {//判断容量是否充足

if(array.length==size)

ensureCapacity(size*2+1);//扩容//从栈顶添加元素

array[++top]=data;

size++;

}/*** 获取栈顶元素的值,不删除

*@return

*/@OverridepublicT peek() {if(isEmpty())newEmptyStackException();returnarray[top];

}/*** 从栈顶(顺序表尾部)删除

*@return

*/@OverridepublicT pop() {if(isEmpty()){newEmptyStackException();

}

size--;return array[top--];

}/*** 扩容的方法

*@paramcapacity*/

public void ensureCapacity(intcapacity) {//如果需要拓展的容量比现在数组的容量还小,则无需扩容

if (capacity

}

T[] old=array;

array= (T[]) newObject[capacity];//复制元素

for (int i=0; i

array[i]=old[i];

}

}

}

packagecom.spring.test;/****/

public classEqualsToHashcodeTest {public static voidmain(String[] args) {

SeqStack s = new SeqStack();

s.push("a");

s.push("B");

s.push("C");int l =s.size();

System.out.println("size-->"+s.size());//size在减少,必须先记录

for(int i=0;i

System.out.println("s.pop"+s.pop());

}

System.out.println("s.peek-->"+s.peek());

}

}

链式栈的设计与实现

了解完顺序栈,我们接着来看看链式栈,所谓的链式栈(Linked Stack),就是采用链式存储结构的栈,由于我们操作的是栈顶一端,因此这里采用单链表(不带头结点)作为基础,直接实现栈的添加,获取,删除等主要操作即可。其操作过程如下图:

从图可以看出,无论是插入还是删除直接操作的是链表头部也就是栈顶元素,因此我们只需要使用不带头结点的单链表即可。代码实现如下,比较简单,不过多分析了:

java stack 从1.5开始?_java数据结构与算法之栈(Stack)设计与实现相关推荐

  1. Java实现自定义队列和树结构_Java数据结构之链表、栈、队列、树的实现方法示例...

    本文实例讲述了java数据结构之链表.栈.队列.树的实现方法.分享给大家供大家参考,具体如下: 最近无意中翻到一本书,闲来无事写几行代码,实现几种常用的数据结构,以备后查. 一.线性表(链表) 1.节 ...

  2. java数据结构与算法之双链表设计与实现

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: java数据结 ...

  3. 数据结构与算法之栈入门题目

    数据结构与算法之栈题目 目录 用数组实现大小固定的队列和栈 实现一个特殊的栈,在实现栈的基础功能上,再实现返回栈中最小元素的操作 如果仅用栈结构实现队列结构和如何仅用队列结构实现栈结构 1. 用数组实 ...

  4. 数据结构与算法--简单栈实现及其应用

    栈 栈(Stack)是一种限制插入和删除只能在一个位置上进行的表,改位置是表的末端,叫做栈顶top.栈的基本操作有push (进栈)pop(出栈) 栈又叫做LIFO(后进先出)表,下图展示普通push ...

  5. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

  6. 数据结构与算法--利用栈实现队列

    利用栈实现队列 上一节中说明了栈的特点 后进先出,我们用数组的方式实现了栈的基本操作api,因此我们对栈的操作是不考虑排序的,每个api的操作基本都是O(1)的世界,因为不考虑顺序,所以找最大,最小值 ...

  7. 新星计划Day7【数据结构与算法】 栈Part1

    新星计划Day7[数据结构与算法] 栈Part1

  8. java树的基本知识_Java数据结构和算法(二)树的基本操作

    Java数据结构和算法(二)树的基本操作 一.树的遍历 二叉树遍历分为:前序遍历.中序遍历.后序遍历.即父结点的访问顺序 1.1 前序遍历 基本思想:先访问根结点,再先序遍历左子树,最后再先序遍历右子 ...

  9. java数据结构 队列_Java数据结构与算法[原创]——队列

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...

最新文章

  1. 谈谈你对面向过程与面向对象的理解
  2. CentOS使用virt-what知道虚拟机的虚拟化技术
  3. 利用Linux系统生成随机密码的10种方法
  4. 多态性——vptr和vtable
  5. 达摩院里的女Leader,一面温柔似水一面灿烂如阳
  6. C#利用反射实现动态加载程序集简单案例
  7. 终于修好了MacBook
  8. windows和linux如何通信,别总是把Windows和Linux混为一谈
  9. 【Vue.js 知识量化】ES6 语法积累
  10. matlab p q的确定,基于MATLAB软件的P-Q分解法潮流计算 (1)
  11. BUG: button点击高亮延迟问题
  12. 空间中点到直线的距离
  13. LCD显示--TM1640芯片驱动程序
  14. 微分中值定理 (罗尔、拉格朗日、柯西)
  15. 249PHP等于多少钱,一百万新台币等于多少人民币
  16. java RandomAccess 遍历效率
  17. Hadoop-kms总结
  18. 编程乐趣:获取12306的所有车站电报码
  19. DNS服务器IP地址大全
  20. 探秘SLAM之RANSAC算法

热门文章

  1. linux服务器安全文档,CentOS Linux服务器安全设置
  2. 合肥php开发培训费用,合肥PHP开发培训之PHP文件基础操作
  3. MyBatis 的执行流程,写得太好了!
  4. Spring-Retry重试实现原理
  5. 这款可视化工具,Java 调优起来真的 so easy啊
  6. 成为阿里 P7 真的难么?
  7. Spring Boot微服务中Chaos Monkey的应用
  8. TypeError: Class advice impossible in Python3. Use the @Implementer class decorator instead
  9. OpenglES2.0 Android:画矩形
  10. struct.error: 'h' format requires -32768 number 32767