栈是一种后进先出的数据结构。在它之上,主要有三种操作:
(1)判断栈是否为空——empty();
(2)在栈顶添加一个元素——push(E);
(3)删除并返回栈顶元素——pop()。
在Java类库中,Stack类实现了栈,它继承自Vector类:
public class Stack<E> extends Vector<E>于是,Stack用数组保存元素:
protected Object[] elementData;用一个整数记录栈中元素的个数:
protected int elementCount;接下来看看栈的三种操作在Stack中是如何实现的。
1.
empty() 方法实现如下:
public boolean empty() { return size() == 0; }
public synchronized int size() { return elementCount; }
2.push(E element)方法实现如下:
public E push(E item) { addElement(item); return item; }
public synchronized void addElement(E obj) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = obj; }
elementData[elementCount++] = obj;
它将元素添加到之前数组中已有元素的后面并把元素个数加1,这正是栈的push操作需要的。
3.pop()方法实现如下:
public synchronized E pop() { E obj; int len = size(); obj = peek(); removeElementAt(len - 1); return obj; }
peek()实现如下:
public synchronized E peek() { int len = size(); if (len == 0) throw new EmptyStackException(); return elementAt(len - 1); }
public synchronized E elementAt(int index) { if (index >= elementCount) { throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); } return elementData(index); }
E elementData(int index) { return (E) elementData[index]; }
接下来看removeElementAt(int)方法:
public synchronized void removeElementAt(int index) { modCount++; if (index >= elementCount) { throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); } else if (index < 0) { throw new ArrayIndexOutOfBoundsException(index); } int j = elementCount - index - 1; if (j > 0) { System.arraycopy(elementData, index + 1, elementData, index, j); } elementCount--; elementData[elementCount] = null; /* to let gc do its work */ }
elementCount--; elementData[elementCount] = null; /* to let gc do its work */这两行通过先把栈中元素数量减1,然后把之前的栈顶元素设置为null使之被垃圾收集器回收达到删除栈顶元素的目的。
原文地址:http://blog.csdn.net/l294265421/article/details/45867575