下壓(LIFO)棧,ResizingArrayStack
阿新 • • 發佈:2018-12-13
能夠動態調整陣列大小的實現:耗時跟棧大小成正比
package com.vadonmo.exp.example; import java.util.Iterator; /** * 下壓(LIFO)棧,能夠動態調整陣列大小的實現 * */ public class ResizingArrayStack<Item> implements Iterable<Item> { // 棧元素 private Item[] a = (Item[]) new Object[1]; // 棧元素數量 private int N = 0; // 是否為空 public boolean isEmpty() { return N == 0; } // 大小 public int size() { return N; } // 動態調整大小 public void resize(int max) { // 將原來的元素全部移到新陣列 Item[] temp = (Item[]) new Object[max]; for (int i = 0, len = temp.length; i < len; i++) { temp[i] = a[i]; } a = temp; } // 增加元素 public void push(Item item) { if (N == a.length) { resize(2 * a.length); } a[N++] = item; } // 刪除元素 public Item pop() { Item item = a[--N]; a[N] = null; if (N > 0 && N == a.length / 4) { resize(a.length / 2); } return item; } @Override public Iterator<Item> iterator() { return new ReverseArrayIterator(); } private class ReverseArrayIterator implements Iterator<Item> { private int i = N; @Override public boolean hasNext() { return i > 0; } @Override public Item next() { return a[--i]; } @Override public void remove() { } } }