栈 是一种基于后进先出(LIFO)的数据结构,其他就不介绍了。
定义了两个私有变量,数组a和元素个数N
void ResizingArrayStack():初始化栈
int size(): 返回栈的元素个数
boolean isEmpty(): 判断栈是否为空
void resize(int):调整栈的大小
push(Item):压栈
pop():出栈
peek():返回栈顶元素
iterator():迭代器
class ReverseArrayIterator :迭代器类
/***********Java 使用数组动态生成栈 *********
* @author ddh
* 2015/12/30
*/
package cn.edu.scut.ddh;
import java.util.Iterator;
import java.util.NoSuchElementException;
@SuppressWarnings("unchecked")
public class ResizingArrayStack<Item> implements Iterable<Item> {
//数组,存放元素
private Item[] a;
//栈中元素个数
private int N;
//构造函数,初始化栈
public ResizingArrayStack(){
a = (Item[]) new Object[2]; //初始化数据大小为2
N = 0;
}
//返回栈的大小
public int size(){
return N;
}
//判断栈是否为空
public boolean isEmpty(){
return N == 0;
}
//调整栈的大小
public void resize(int capacity){
Item[] nItems = (Item[]) new Object[capacity];
for(int i=0; i < N; i++){
nItems[i] = a[i];
}
a = nItems;
}
//压栈
public void push(Item item){
if(N == a.length) resize(2 * N);
a[N++] = item;
}
//出栈
public Item pop(){
if( isEmpty()) throw new NoSuchElementException();
Item item = a[N-1];
a[N-1] = null;
N--;
if(N >0 && N == a.length / 4) resize(a.length / 2);
return item;
}
//返回栈顶元素,其实这是浅复制,会影响原先的元素
public Item peek(){
if(isEmpty()) throw new NoSuchElementException();
return a[N-1];
}
public Iterator<Item> iterator() {
// TODO Auto-generated method stub
return new ReverseArrayIterator();
}
//创建一个迭代器私有类,
private class ReverseArrayIterator implements Iterator<Item>{
private int i;
public ReverseArrayIterator(){
i = N-1;
}
public boolean hasNext() {
return i >= 0;
}
public Item next() {
if(!hasNext()) throw new NoSuchElementException();
return a[i--];
}
public void remove() {
}
}
/**
* Unit tests the <tt>Stack</tt> data type.
*/
public static void main(String[] args) {
ResizingArrayStack<String> s = new ResizingArrayStack<String>();
while (!StdIn.isEmpty()) {
String item = StdIn.readString();
if (!item.equals("-")) s.push(item);
else if (!s.isEmpty()) StdOut.print(s.pop() + " ");
}
StdOut.println("(" + s.size() + " left on stack)");
}
}