java数据结构之java实现栈

时间:2023-11-25 05:32:36 


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,数据结构,栈
0
投稿

猜你喜欢

  • Android使用Item Swipemenulistview实现仿QQ侧滑删除功能

    2021-08-16 19:47:35
  • Android中AlertDialog四种对话框的最科学编写用法(实例代码)

    2021-09-07 10:25:58
  • C++判断pe文件实例

    2022-01-19 12:29:52
  • 解决SpringCloud下spring-boot-maven-plugin插件的打包问题

    2022-03-10 14:35:59
  • 保证缓存和数据库的数据一致性详解

    2023-11-18 08:10:44
  • Android下拉刷新以及GridView使用方法详解

    2022-12-26 18:01:24
  • Java链表中元素删除的实现方法详解【只删除一个元素情况】

    2023-01-16 11:49:41
  • java使double保留两位小数的多方法 java保留两位小数

    2023-06-17 14:01:30
  • Android实现EditText中添加和删除bitmap的方法

    2022-04-02 00:51:14
  • Java实现并查集示例详解

    2023-07-17 05:41:34
  • Java File类提供的方法与操作

    2023-08-29 09:10:41
  • SpringCloud Eureka的使用教程

    2022-03-23 22:30:59
  • Spring中自动装配的4种方式

    2021-08-01 16:44:41
  • C#的String和StringBuilder详解

    2022-06-21 09:51:31
  • 拉钩网java笔试题分享

    2022-02-13 08:48:25
  • 详解Java中类的加载与其初始化

    2023-06-21 04:56:45
  • c#文档图片自动纠偏

    2022-08-07 13:45:39
  • SpringBoot Entity中枚举类型详细使用介绍

    2023-11-11 00:30:52
  • springmvc 分页查询的简单实现示例代码

    2022-01-09 11:08:22
  • SpringBoot工程下使用OpenFeign的坑及解决

    2022-08-24 18:00:38
  • asp之家 软件编程 m.aspxhome.com