栈--数组存储--Java实现

来源:互联网 发布:影视动画行业 知乎 编辑:程序博客网 时间:2024/06/05 14:41

是一种基于后进先出(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];  //初始化数据大小为2N = 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 stubreturn 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)");    }}



0 0