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中Filter、Servlet、Listener的学习资料,希望大家喜欢1、Filter的功能filter功能,它使用户可以改变一个
- 前言当我们爱上lambda并且大范围使用它的时候,我想大家都会被lambda中的return语句狠狠地调戏过,所以今天我们需要一起来揭开la
- 本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下:简单描述最高位是符号位,始终为0,不可用。41位的时间序列,
- 关于MouseWheelListener的鼠标滚轮事件Java中JPanel面板中对鼠标滚轮事件的处理。一、MouseWheelListen
- android在设计View类时,为了能储存一些辅助信息,设计一个一个setTag/getTag的方法。这让我想起在Winform设计中每个
- 一、使用spring initializr创建java工程 1、启动IDEA,新建java工程,使用向导创建一个springboo
- 一、Servlet3.0异步请求@WebServlet(value = "/async", asyncSupported
- 本文实例为大家分享了Android半圆环型进度效果的具体代码,供大家参考,具体内容如下package com.newair.ondrawte
- 1.摘要Android手机间通过蓝牙方式进行通信,有两种常见的方式,一种是socket方式,另一种是通过Gatt Server(Androi
- 本文实例讲述了Android编程判断当前应用是否在后台运行的方法。分享给大家供大家参考,具体如下:/** 判断程序是否在后台运行 */pub
- 在日常开发中,可能会遇到同一份代码,需要根据运营需求打出不同包名、不同图标、不同名称的Apk,发布到不同的渠道中。Android Studi
- Android Studio是谷歌推出一个Android集成开发工具,基于IntelliJ IDEA。它类似于Eclipse ADT,And
- 这篇文章主要介绍了简单了解java标识符的作用和命名规则,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 单例模式一个类只有一个实例,并且可以全局访问使用应用场景如账户管理类,数据库操作类等(某个对象频繁被访问使用)常用方式饿汉式懒汉式同步加锁D
- 实现流程初始化一定数量的任务处理线程和缓存线程池,用户每次调用接口,开启一个线程处理。假设初始化5个处理器,代码执行 BlockingQue
- Struts2中提供了数据校验验证数据例如验证邮件、数字等。验证方式有3种:一是通过validate()方法,二是通过Xml,三是使用注解方
- 类是使用关键字 class 声明的,如下面的示例所示:访问修饰符 class 类名 { //类成员: // Methods, prope
- 抽象类(abstract):抽象类不能创建实例,它只能作为父类被继承。抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象。从多个具有
- 为什么Android要申请权限简单说下在Android6.0及6.0以上一些google认为涉及“危险和用户隐私”的一些权限不仅要做清单文件