Java数据结构-基于数组的栈和泛型
生活随笔
收集整理的這篇文章主要介紹了
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数据结构-基于数组的栈和泛型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS9怎么分屏? iOS9画中画怎么用
- 下一篇: iPhone怎么辨别翻新机?iPhone