Java数据结构-基于数组的栈和泛型
泛型可以参数化变量的类型
当你需要用不同类型的基本类型变量来调用构造方法时你需要泛型
public class Test {public static void main(String[] args) {A a=new A("a");System.out.println(a.e);A a1=new A(10);System.out.println(a1.e);}
}
class A<E>{E e;public A(E e){this.e=e;}public E getE(){return e;}}
输出结果:
a
10
如果不满意 你可以使用两个泛型 你甚至可以使用一个数组或者自定义的类
/*** Created by root on 16-2-23.*/
public class Test {public static void main(String[] args) {A a=new A("a");System.out.println(a.e);a.setT(new int[]{1,2,3});//你可以在这里赋给t一个数组或者以个自定义类A a1=new A();a1.setT(new B());//赋给a2的成员t一个B类对象}
}
class A<E,T>{E e;T t;public A(){}public A(E e){this.e=e;}public E getE(){return e;}public void setT(T t){this.t=t;}public T getT(){return t;}}
class B{int b=10;
}
debug结果
有时你需要对泛型作出一些约束以免发生错误溢出
public class Test {public static void main(String[] args) {A<String,String> a=new A();//对泛型作出一些约束 让它只能接受String类型A a2=new A<String,String>();//同样的约束 但是要约束的参数要紧跟类名a.setT("a");//正确的方法//a.setT(10); 出现报错}
}
class A<E,T>{E e;T t;public A(){}public A(E e){this.e=e;}public E getE(){return e;}public void setT(T t){this.t=t;}public T getT(){return t;}}
class B{int b=10;
}
虽然java不能直接声明泛型数组 但是可以利用泛型自己写一个泛型数组类
public class ArrayType<T> {private int index;private int length;T[] data;private T el;public ArrayType(int length){//根据长度初始化数组this.length=length;data=(T[])(new Object[length]);}public void setEl(int thatIndex,Object el){//根据索引赋值 变量的类型可以使任意的if(thatIndex<length){data[thatIndex]=(T)el;}}public T getEl(int thatIndex){//根据索引获取元素的值if(thatIndex<length){return data[thatIndex];}else {return data[0];}}
}
test class
public class Test {public static void main(String[] args){ArrayType a=new ArrayType(3);a.setEl(0,23);a.setEl(1,"dd");a.setEl(2,true);}
}
debug结果:
加入一些变长的功能
public class ArrayType<T> {private int index;private int length;T[] data;private T el;public ArrayType(int length){this.length=length;data=(T[])(new Object[length]);}public void setEl(int thatIndex,Object el){if(thatIndex<length){data[thatIndex]=(T)el;}else {stretch(thatIndex+1);//如果数组越界 执行复制data[thatIndex]=(T)el;}}public T getEl(int thatIndex){if(thatIndex<length){return data[thatIndex];}else {stretch(thatIndex+1);//如果数组越界 执行赋值 并返回nullreturn data[thatIndex];}}protected void stretch(int thatLength){T[] newdata=(T[])(new Object[thatLength]);//定义一个thatLength的数组for(int i=0;i<this.length;i++){ //把data内所有元素复制到data里newdata[i]=data[i]; //}data=newdata;}
}
有了以上基础 可以实现一个简单的数组栈
public interface Stack<E> {public boolean isEmpty();public E peek();public E pop();public void push(E target);
}
import java.util.EmptyStackException;
import java.util.Objects;/*** Created by root on 16-2-24.*/
public class ArrayStack<E> implements Stack {//实现栈的interfaceprivate E[] data; //可以获得数组长度private int size; //用于判断栈顶的索引public ArrayStack(){data=(E[])(new Object[1]);//初始化的栈具有一个null类型 size的值为0 size-1是栈顶的索引size=0; }public boolean isEmpty(){return size==0; //判断栈是否为空 }public Object pop(){if (isEmpty()){throw new EmptyStackException();//如果栈为空 那就报错}size--; //如果栈不为空 return data[size]; //弹出栈顶}public Object peek(){if(isEmpty()){throw new EmptyStackException();//如果栈为空 报错}return data[size-1];//返回栈顶}protected boolean isFull(){//栈满了?return size ==data.length;}public void push(Object target){if (isFull()){//如果栈满了 执行扩栈stretch();}data[size]= (E) target;//如果栈没有满 把target压入栈顶size++;}protected void stretch(){//将原数组的长度扩大两倍 扩大栈的长度E[] newData=(E[])(new Object[data.length*2]);for(int i=0;i<data.length;i++){newData[i]=data[i];}data=newData;}
}
转载于:https://www.cnblogs.com/Salaku/p/5208728.html
Java数据结构-基于数组的栈和泛型相关推荐
- java中基于数组的栈实现
在java中利用数组来实现栈以及相关操作. 首先我们要新建一个类,该类中new一个固定大小的数组,来充当我们的栈,来容纳入栈的数据. 在该类中我们可以对栈进行出栈入栈,扩容,和获取栈顶元素等操作.在该 ...
- Java数据结构与算法:栈
原文出处:http://www.cnblogs.com/skywang12345/p/3562239.html 注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈 1. 栈的介绍 栈(stack) ...
- java数据结构之数组
数据结构对我们的程序员也是非常重要的,相当于一个基础学科,从今天开始,咱们再重新学习一下数据结构吧 1,首先我们要定义一下泛型,初始化成员变量,声明构造方法. private T data[];pri ...
- 类模板实现基于数组的栈
一.学习要点: 1.类模板和模板类的区别,模板类这里的模板可以看成一个动词,对抽象类的一个实例化: 2.函数模板的声明和定义: 3.基于数组栈的实现,进栈和出栈的差别,进栈[++top],出栈[top ...
- 数据结构之数组模拟栈
栈的特点即先进后出,采用数组模拟栈,实现栈的这一特性主要是靠定义一个指针(索引). 指针的初始位置指向的是-1 以下给出代码: package com.ebiz.stack;/*** @author ...
- java:数据结构(二)栈的应用(进制转换全收集)
说到进制转换,java已经封装了基本的方法,在竞赛中使用封装的方法自然能节省大量时间 另一位仁兄介绍的封装好的方法: https://blog.csdn.net/m0_37961948/article ...
- java分隔符算法_《Java数据结构和算法》栈 分隔符分配
分隔符包括"{"."["."("."] ".")"."}",每个左分隔符需要右分 ...
- Java练习 基于数组的敏感词过滤/用户注册合法性判定
用户注册 在注册时通常要验证用户名和密码是否合法,运用学习过的知识完成如下操作: 用户名长度大于等于6位 密码长度大于等于8位,必须包含英文字母以及数字 以上两个条件同时成立注册才能成功. packa ...
- JAVA数据结构-稀疏数组
稀疏数组 什么是稀疏数组? 假设有这样的一个二维数组 shape是11x11,但是很多数据都是0,比较浪费空间,我们可以通过一些方法来压缩这个数组,稀疏数组就是一种压缩数组的方法,通过稀疏数组变换后, ...
最新文章
- 继往开来!目标检测二十年技术综述
- egg 自学入门demo分享
- 5加载stm32 keil_快速入门STM32单片机-软件篇
- Java8新特性之函数式接口
- Kali-linux安装之后的简单设置
- 如何为ASP.NET Core设置客户端IP白名单验证
- 增加数据_咱晋城人口又增加了?最新数据来了
- spoj839 Optimal Marks(最小割,dinic)
- Jest 只MOCK模块中的某个功能实现
- nslookup 使用说明
- 让人头皮发麻的KMP的next函数 困扰我三四天后终于解决了
- LayUI清空下拉框的值
- 怎么选择boost升压电路的电感?只要三个公式
- element-ui 导航栏三级
- SpringBoot调优
- 站长咪咪网整理的Linux命令大全
- 论文阅读笔记:An End-to-End Trainable Neural Network Model with Belief Tracking for Task-Oriented Dialog
- PC机上常用 EDA 软件
- 声纹技术(七):声纹技术的未来
- SUT计算机测试,调试功能测试(徽标) | Microsoft Docs
热门文章
- 在CentOS Linux上安装oracle11g之二 安装oracle11g
- BMI指数与体重的关系
- flink写入iceberg(没有搞完)
- 集群状态正常时需要的jps进程+是否需要部署到各个节点(持续更新中)
- django-oscar的默认地点打开后总是united kingdom
- 医学图像-颅内出血(转载+整理)
- 3.2 参数估计:极大似然估计方法 ML
- oracle xml文件是什么文件,介绍关于Oracle下存取XML格式数据的方式
- C/C++编程心得(二)
- mysql导出数据到本地_mysql怎么导出数据到本地文件