java数据结构之java实现栈

 更新时间:2014年03月21日 09:20:49   作者:  
这篇文章主要介绍了java数据结构实现栈,需要的朋友可以参考下

复制代码 代码如下:

import java.util.Arrays;

/**
 * 栈的实现<br>
 * @author Skip
 * @version 1.0
 */
public class Stack<T> {
 private int size;    //栈中元素的个数
 private Object[] arr;  //底层数组
 private final int defaultLength = 200; //默认长度

 /**
  * 无参构造,使用默认长度初始化数组
  */
 public Stack(){
  arr = new Object[defaultLength];
  size = 0;
 }

 /**
  * 使用长度参数初始化数组
  * @param length 长度
  */
 public Stack(int length){
  arr = new Object[length];
  size = 0;
 }

 /**
  * 入栈
  * @param element 数据
  */
 public void push(T element){
  //是否需要扩容
  if(size >= arr.length){
   //数组扩容
   extendCapacity(size+1);
  }
  arr[size++] = element;
 }

 /**
  * 出栈
  * @return 数据
  */
 @SuppressWarnings("unchecked")
 public T pop(){
  //元素个数为0,无法执行出栈操作
  if(size==0){
   return null;
  }
  T t = (T)arr[size-1];
  arr[--size] = null;  //数据已出栈,还原为null
  return t;
 }

 /**
  * 清空栈
  */
 public void clear(){
  for(int i=0;i<size;i++){
   arr[i]=null;
  }
  size = 0;
 }

 /**
  * 获得当前栈中元素的个数
  * @return 元素的个数
  */
 public int getSize(){
  return size;
 }

 /**
  * 判断是否为空栈
  * @return 空为true,非空为false
  */
 public boolean isEmpty(){
  return size == 0;
 }

 /**
  * 打印栈中所有的元素
  */
 @SuppressWarnings("unchecked")
 public void printStack(){
  for(int i=0;i<size;i++){
   System.out.print(((T)arr[i]).toString());
  }
  System.out.println();
 }

 /**
  * 扩容
  * @param length 需要的长度
  */
 private void extendCapacity(int length){
  //当前数组长度和需要的长度取最大
  int minCapacity = Math.max(arr.length, length);
  //判断是否需要扩容
  if(minCapacity - arr.length>0){
   //数组长度增加一半
   int newLength = arr.length + arr.length/2;
   //如果新的长度还比需求要小,将需求的长度作为数组长度
   if(newLength < minCapacity){
    newLength=minCapacity;
   }
   //数组长度不能超过Integer.Max_Value
   if(newLength > Integer.MAX_VALUE - 8){
    newLength = Integer.MAX_VALUE;
   }
   //数组扩容
   arr = Arrays.copyOf(arr, newLength);
  }
 }
}

相关文章

  • Java基础之方法重写详解

    Java基础之方法重写详解

    这篇文章主要介绍了Java基础之方法重写详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • 老生常谈 MyBatis 复杂查询

    老生常谈 MyBatis 复杂查询

    这篇文章主要介绍了 MyBatis 复杂查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Java开发中POJO和JSON互转时如何忽略隐藏字段的问题

    Java开发中POJO和JSON互转时如何忽略隐藏字段的问题

    这篇文章主要介绍了Java开发中POJO和JSON互转时如何忽略隐藏字段的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • IDEA必备开发神器之EasyCode

    IDEA必备开发神器之EasyCode

    对于java程序员来说,日常工作中就是crud的操作,每次都要搭建MVC三层,还是很繁琐,这里就出现了神器easycode的工具.可以快速生成代码.并且还可以自定义模板.需要的朋友可以参考下
    2021-05-05
  • springboot中如何使用openfeign进行接口调用

    springboot中如何使用openfeign进行接口调用

    这篇文章主要介绍了springboot中如何使用openfeign进行接口调用问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • idea使用war以及war exploded的区别说明

    idea使用war以及war exploded的区别说明

    本文详细解析了war与warexploded两种部署方式的差异及步骤,war方式是先打包成war包,再部署到服务器上;warexploded方式是直接把文件夹、class文件等移到Tomcat上部署,支持热部署,开发时常用,文章分别列出了warexploded模式和war包形式的具体操作步骤
    2024-10-10
  • Idea使用插件实现逆向工程搭建SpringBoot项目的图文教程

    Idea使用插件实现逆向工程搭建SpringBoot项目的图文教程

    这篇文章主要介绍了Idea使用插件实现逆向工程搭建SpringBoot项目,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Java中6种单例模式写法代码实例

    Java中6种单例模式写法代码实例

    这篇文章主要介绍了Java中6种单例模式写法代码实例,某个类任何情况下只有一个实例,并提供一个全局访问点来获取该实例,Java6种单例模式有2种懒汉式,2种饿汉式,静态内部类 ,枚举类,需要的朋友可以参考下
    2024-01-01
  • java的MybatisPlus调用储存过程的返回数据问题

    java的MybatisPlus调用储存过程的返回数据问题

    这篇文章主要介绍了java的MybatisPlus调用储存过程的返回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 详解IDEA下Gradle多模块(项目)的构建

    详解IDEA下Gradle多模块(项目)的构建

    这篇文章主要介绍了详解IDEA下Gradle多模块(项目)的构建,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01

最新评论