- 最近使用Java实现队列、栈这些基本的数据结构时,我分别采用了LinkedList列表和ResizeArray可变数来实现,先看看基本的API:
public interface Stack<T> {
public T pop();
public void push(T item);
public boolean isEmpty();
}
public class StackLinkedList<T> implements Stack<T>{
private Node<T> first = null;
@SuppressWarnings("hiding")
private class Node<T>{
T item;
Node<T> next;
}
@Override
public T pop() {
T item = first.item;
first = first.next;
return item;
}
@Override
public void push(T item) {
Node<T> oldfirst = first;
first = new Node<T>();
first.item = item;
first.next = oldfirst;
}
@Override
public boolean isEmpty() {
return first==null;
}
}
- 使用可变数组时出现了一些问题,首先需要考虑的是使用数组时扩容的问题,我分别采取的是:
- 当数组满了时,将数组容量扩大一倍;
- 当数组元素不足数组容量的1/4时将数组容量缩小一半
- 另一个问题是无法初始化泛型数组,采取的方式是先创建一个Object[]数组,然后将其强制类型转换为T[],但实际上这种强制类型转换是很不友好的,但我不得不这么做(⊙o⊙)…
public class StackResizeArray<T> implements Stack<T>{
private T[] array;
private int n;
@SuppressWarnings("unchecked")
public StackResizeArray(){
array = (T[])new Object[1];
n = 0;
}
@SuppressWarnings("unchecked")
private void resize(int capacity) {
T[] newarray = (T[])new Object[capacity];
for(int i=0; i<n; i++){
newarray[i] = array[i];
}
array = newarray;
}
@Override
public T pop() {
T item = array[--n];
array[n] = null;
if(n>0 && n<array.length/4){
resize(array.length/2);
}
return item;
}
@Override
public void push(T item) {
if(n==array.length){
resize(array.length*2);
}
array[n++] = item;
}
@Override
public boolean isEmpty() {
return n==0;
}
}