ArrayStack成员和各个方法实现
有了ArrayList的实现,实现ArrayStack好多了。
public void push(Telement); 需要数组 T[],容量,增量,栈顶
public T pop(); 需要数组 T[]
public T peek(); 需要数组 T[]
public boolean isEmpty(); 需要栈顶
public int size(); 需要栈顶
public Iterator<T> itorator(); 需要数组 T[]
public String toString(); 需要数组 T[]
成员可以定义4个如下:
public class ArrayStack<T> implements StackADT<T> {
private final int DEFAULT_CAPACITY = 100;
private final int INCREMENT=10;
private T[] stack;
private int top;
….
}
方法的实现
构造方法
@SuppressWarnings("unchecked")
public ArrayStack(){
//stack = newT[DEFAULT_CAPCITY];
stack = (T[])(new Object[DEFAULT_CAPACITY]);
top = 0;
}
Push方法:异常情况是栈满
@Override
public void push(T element) {
if(stack.length == top)
expandCapacity();
stack[top] = element;
top ++;
}
private void expandCapacity() {
stack = Arrays.copyOf(stack, stack.length+INCREMENT);
}
其他方法也相对比较简单。注意,top就是栈中实际元素的数量
@Override
public T pop() {
if(isEmpty())
throw new EmptyCollectionException("the stack is empty!");
top--;
T result = stack[top];
stack[top] = null;
return result;
}
@Override
public T peek() {
if(isEmpty())
throw new EmptyCollectionException("the stack is empty!");
return stack[top-1];
}
@Override
public boolean isEmpty() {
if(0== size())
return true;
else
return false;
}
@Override
public int size() {
return top;
}
迭代的实现。和ArrayList的实现方法差不多。总是就是2个方法而已,一个问“有没有下个了”,如果有,那么另一个方法就“返回下一个”。
@Override
public Iterator<T> iterator() {
return new ArrayStackIterator();
}
private class ArrayStackIterator<T> implementsIterator<T>{
int pointer = -1;
@Override
public boolean hasNext() {//有没有下一个?
if(pointer < top-1)
return true;
else
return false;
}
@Override
public T next() {//返回下一个
pointer++;
return (T) stack[pointer];
}
}
public String toString(){
//调用了iterator,然后把元素的toString累计到一起就行了。每个人都会。。
Iterator<T> it = iterator();
StringBuilder sb = new StringBuilder();
while(it.hasNext()){
sb.append(it.next().toString()+"\n");
}
return sb.toString();
}