棧是一種後進先出(Last in First out LIFO)的線性數據結構,在此簡單用動態數組實現一個棧結構。棧結構雖簡單,但卻很是有用,應用諸如編輯器的撤銷操做、程序的方法調用棧等。segmentfault
/** * 動態數組,數組二次封裝 */ public class Array<E> { /** * 基於Java原生數組,保存數據的容器 */ private E[] data; /** * 當前元素個數 */ private int size; public Array(int capacity) { data = (E[]) new Object[capacity]; size = 0; } /** * 默認數組容量capacity=10 */ public Array() { this(10); } /** * 獲取數組中元素個數 * @return */ public int getSize() { return size; } /** * 獲取數組的容量 * @return */ public int getCapacity() { return data.length; } /** * 判斷數組是否爲空 * @return */ public boolean isEmpty() { return size == 0; } /** * 在全部元素後面添加新元素 * @param e 元素 */ public void addLast(E e) { add(size, e); } /** * 在全部元素前面添加新元素 * @param e 元素 */ public void addFirst(E e) { add(0, e); } /** * 向index索引位置插入一個新元素e * @param index 數組索引位置 * @param e 元素 */ public void add(int index, E e) { if (index < 0 || index > size) { throw new IllegalArgumentException("addList failed. index < 0 || index > size"); } //空間不足,擴容 if (size == data.length) { resize(2 * data.length); } for (int i = size - 1; i >= index; i--) { data[i + 1] = data[i]; } data[index] = e; size++; } /** * 根據元素索引獲取數組元素 * @param index 索引 * @return */ public E get(int index) { if (index < 0 || index >= size) { throw new IllegalArgumentException("get failed. index is illegal"); } return data[index]; } /** * 獲取數組最後一個元素 * @return */ public E getLast() { return get(size - 1); } /** * 獲取數組第一個元素 * @return */ public E getFirst() { return get(0); } /** * 根據元素索引修改數組元素 * @param index 索引 * @param e 元素 * @return */ public void set(int index, E e) { if (index < 0 || index >= size) { throw new IllegalArgumentException("get failed. index is illegal"); } data[index] = e; } /** * 判斷包含元素 * @param e 元素 * @return */ public boolean contains(E e) { for (int i = 0; i < size; i++) { if (data[i].equals(e)) { return true; } } return false; } /** * 查找元素索引 * @param e 元素 * @return 返回元素索引,若是不存在則返回-1 */ public int find(E e) { for (int i = 0; i < size; i++) { if (data[i].equals(e)) { return i; } } return -1; } /** * 移除指定索引的元素 * @param index 索引 * @return 返回被移除的元素 */ public E remove(int index) { if (index < 0 || index >= size) { throw new IllegalArgumentException("get failed. index is illegal"); } E ret = data[index]; for (int i = index + 1; i < size; i++) { data[i - 1] = data[i]; } size--; data[size] = null; //空間利用率低,數組縮容,防止複雜度震盪 if (size == data.length / 4 && data.length / 2 != 0) { resize(data.length / 2); } return ret; } /** * 移除第一個元素 * @return 返回被移除元素 */ public E removeFirst() { return remove(0); } /** * 移除最後一個元素 * @return 返回被移除元素 */ public E removeLast() { return remove(size - 1); } /** * 移除數組中一個元素 * @param e 元素 */ public void removeElement(E e) { int index = find(e); if (index != -1) { remove(index); } } /** * 數組容器擴容、縮容 * @param newCapacity 新的容量 */ private void resize(int newCapacity) { E[] newData = (E[]) new Object[newCapacity]; for (int i = 0; i < size; i++) { newData[i] = data[i]; } data = newData; } @Override public String toString() { StringBuilder res = new StringBuilder(); res.append(String.format("Array: size = %d, capacity = %d\n", size, data.length)); res.append("["); for (int i = 0; i < size; i++) { res.append(data[i]); if (i != size - 1) { res.append(", "); } } res.append("]"); return res.toString(); } }
public interface Stack<E> { /** * 獲取棧中元素個數 * @return */ int getSize(); /** * 判斷棧中是否沒有元素 * @return */ boolean isEmpty(); /** * 入棧 * @param e 元素 */ void push(E e); /** * 出棧 * @return 彈出元素 */ E pop(); /** * 查看棧頂元素 * @return */ E peek(); }
/** * 基於動態數組實現棧 * @param <E> */ public class ArrayStack<E> implements Stack<E> { private Array<E> array; public ArrayStack(int capacity) { array = new Array<>(capacity); } public ArrayStack() { array = new Array<>(); } /** * 獲取棧中元素個數 * @return */ @Override public int getSize() { return array.getSize(); } /** * 判斷棧中是否沒有元素 * @return */ @Override public boolean isEmpty() { return array.isEmpty(); } /** * 獲取容量 * @return */ public int getCapacity() { return array.getCapacity(); } /** * 入棧 * @param e 元素 */ @Override public void push(E e) { array.addLast(e); } /** * 出棧 * @return 彈出元素 */ @Override public E pop() { return array.removeLast(); } /** * 查看棧頂元素 * @return */ @Override public E peek() { return array.getLast(); } @Override public String toString() { StringBuilder res = new StringBuilder(); res.append("Stack: "); res.append("["); for (int i = 0; i < array.getSize(); i++) { res.append(array.get(i)); if (i != array.getSize() - 1) { res.append(", "); } } res.append("] top"); return res.toString(); } }