栈的顺序存储结构实现

package com.kiger.Sequence;import java.util.Arrays;/*** @ClassName SequenceStack* @Description 顺序栈实现* @Author zk_kiger* @Date 2019/6/20 21:16* @Version 1.0*/public class SequenceStack<T> {private final int DEFAULT_SIZE = 10;// 保存当前数组的长度private int capacity;// 数组长度不够时,程序每次增加的数组长度private int capacityIncrement = 0;// 保存顺序栈的数据元素private Object[] elementData;// 顺序栈元素个数private int size;// 以默认长度创建空的顺序栈public SequenceStack() {capacity = DEFAULT_SIZE;elementData = new Object[capacity];}// 以一个初始化元素创建顺序栈public SequenceStack(T element) {this();elementData[0] = element;size++;}/*** 以指定长度创建顺序栈* @param element 第一个元素* @param initSize 指定顺序栈的底层数组长度*/public SequenceStack(T element, int initSize) {capacity = initSize;elementData = new Object[capacity];elementData[0] = element;size++;}/*** 以指定长度创建顺序栈,同时指定底层数组增量* @param element 第一个元素* @param initSize 指定顺序栈的底层数组长度* @param capacityIncrement 底层数组长度不够时,每次增加的增量*/public SequenceStack(T element, int initSize, int capacityIncrement) {capacity = initSize;this.capacityIncrement = capacityIncrement;elementData = new Object[capacity];elementData[0] = element;size++;}/*** 获取元素个数* @return*/public int length() {return size;}/*** 入栈* @param element*/public void push(T element) {this.ensureCapacity(size + 1);// 将元素放到数组,同时长度+1elementData[size++] = element;}/*** 扩大数组容量* @param minCapacity 所需的数组容量*/private void ensureCapacity(int minCapacity) {// 数组原有长度小于所需容量if(minCapacity > capacity) {// 如果给定了数组增量if(capacityIncrement > 0) {while (minCapacity > capacity) {capacity += capacityIncrement;}} else {while (minCapacity > capacity) {capacity <<= 1;}}// 将原有的数组长度变为新的capacityelementData = Arrays.copyOf(elementData, capacity);}}/*** 出栈* @return 出栈元素*/public T pop() {// 若当前为空栈if(size == 0) {return null;}T oldValue = (T)elementData[size-1];// 释放栈顶元素,同时长度-1elementData[--size] = null;return oldValue;}/*** 返回栈顶元素* @return 栈顶元素*/public T getPeek() {if (size == 0) {return null;}return (T)elementData[size-1];}/*** 返回是否为空* @return*/public boolean isEmpty() {return size == 0;}/*** 清空栈*/public void clear() {Arrays.fill(elementData, null);size = 0;}public String toString() {if (size == 0) {return "[]";} else {StringBuilder sb = new StringBuilder("[");for (int i = size - 1; i >= 0; i--) {sb.append(elementData[i].toString() + ", ");}sb.append("]");int length = sb.length();// 删除多余的“,”和空格return sb.delete(length - 3, length - 1).toString();}}
}

测试代码

package com.kiger.Sequence;import org.junit.Test;/*** @ClassName SequenceStackTest* @Description 测试* @Author zk_kiger* @Date 2019/6/20 22:04* @Version 1.0*/public class SequenceStackTest {@Testpublic void test() {// 以指定第一个元素和底层数组长度的方式构建顺序栈SequenceStack<String> sStack = new SequenceStack<String>("我", 2);System.out.println("当前所含内容" + sStack);// 压入数据元素,元素格式大于了定义栈时底层数组的长度sStack.push("是");sStack.push("liuhao");sStack.push("程序员");// 发现是先入后出的方式打印的System.out.println("当前所含内容" + sStack);// 获取栈中元素个数System.out.println("当前栈中元素个数是:" + sStack.length());// 获取栈顶元素System.out.println("当前栈顶元素是:" + sStack.getPeek());// 弹出元素System.out.println("弹出元素:" + sStack.pop());// 发现是先入后出的方式打印的System.out.println("当前所含内容" + sStack);// 获取栈顶元素System.out.println("当前栈顶元素是:" + sStack.getPeek());// 获取栈中元素个数System.out.println("当前栈中元素个数是:" + sStack.length());// 判断是否为空栈System.out.println("当前栈是否为空:" + sStack.isEmpty());// 清空栈sStack.clear();// 判断是否为空栈System.out.println("当前栈是否为空:" + sStack.isEmpty());// 获取栈顶元素,空栈时返回nullSystem.out.println("当前栈顶元素是:" + sStack.getPeek());// 获取栈中元素个数System.out.println("当前栈中元素个数是:" + sStack.length());// 空栈时进行弹出元素System.out.println("弹出元素:" + sStack.pop());}
}

栈顺序存储 - Java实现相关推荐

  1. 46栈内存溢出、内存区域(程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区、直接内存、内存溢出)与内存溢出(对象实例化分析)

    46.什么情况下会发生栈内存溢出 46.1.Java 内存区域与内存溢出 46.1.1.内存区域 46.1.1.1.程序计数器 46.1.1.2.Java 虚拟机栈 46.1.1.3.本地方法栈 46 ...

  2. mfc try catch 捕获并显示_“全栈2019”Java异常第十七章:Error该不该被捕获?

    难度 初级 学习时间 30分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 友情提示 本教学属于系列教学,内容具有连贯性,本章使用到的内 ...

  3. Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存

    前言: 该章节知识点梳理:本文主要是入门和了解jvm,不做深入 1.Java代码是如何运行起来的? 2.类加载到使用的过程? 3.验证准备和初始化的过程? 4.类从加载到使用核心阶段:初始化.类加载器 ...

  4. “全栈2019”Java第十三章:基本数据类型

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. 用队列实现栈(Java)

    用队列实现栈(Java) 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push.top.pop 和 empty). 实现 MyStack 类: void push( ...

  6. C语言栈顺序存储的数据结构

    typedef int SElemType ; typedef struct{SElemType data [ MAXSIZE ];int top ; } SqStack , * SqtackPtr ...

  7. python全栈和java全栈_Java和全栈开发哪个发展前景好

    展开全部 全栈和java哪个能更好62616964757a686964616fe58685e5aeb931333365633839迎合市场需求,有同学咨询学习哪个在以后前景和工作薪水上能更吃香,首先我 ...

  8. 算法学习1:定容字符串栈的Java实现

    算法学习1:定容字符串栈的Java实现 代码 import java.io.File; import java.io.FileNotFoundException; import java.util.S ...

  9. 左神算法:用递归函数和栈逆序一个栈(Java版)

    题目描述 一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1.将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数 ...

最新文章

  1. windows 10配置VS+MPI编程环境
  2. 13个知识点,系统整理Python时间处理模块Datetime
  3. [Matlab] 画图命令
  4. 中原标准时间对时_GPS对时系统(时间同步系统)应用电子政务
  5. mysql远程备份工具_innobackupex实现MySQL远程备份
  6. cascade=CascadeType.ALL的深坑
  7. 常见错误及细小知识点锦集
  8. BootStrap的介绍与案例使用
  9. 计算机学院实验室安全管理办法,江苏大学计算机学院实验室安全管理制度
  10. 数据库系统概论--课后习题
  11. [ openwrt ] 添加一个通过GPIO控制的LED
  12. ip地址解析(scala)
  13. java 获取当前月的第一天和最后一天
  14. VS 调试时,不允许修改代码
  15. Unity3D 如何干净的解除父子关系
  16. quadro 2000专业显卡 win7计算机体验指数5.9,英伟达全新Quadro K2200专业级显卡评测...
  17. 通信信号处理的一些基本常识
  18. 《认知天性》读书笔记
  19. 漏洞解决方案-SQL注入攻击
  20. STM32——打地鼠

热门文章

  1. 模具图想要绘的好,方法是什么?
  2. Linux auditd主机系统安全审计服务配置技术方案
  3. 第十二届蓝桥杯Java B组——前期知识汇总梳理
  4. STEP-已成为国际标准的应用协议(AP)
  5. 经验分享(二)如何使用Origin画出SCAPS-1D的仿真结果图
  6. HTC G7 连接隐藏SSID的WIFI
  7. JavaJ基础知识9【类和对象1】
  8. 命令行备忘录 navi 使用教程
  9. 物联卡中心:物联卡资费是一样的吗?移动物联卡资费标准!
  10. uniapp 打包安卓 Android 抖音app 后端篇~02