標籤:
1,首先總結一下線性表(分為順序表和連結資料表,【即順序儲存結構和鏈式儲存結構的區別】)和棧(順序棧和連結棧)還有隊列(順序隊列和連結隊列)的JAVA類庫中的實現:
java.util.ArrayList 實現了順序表,java.util.LinkedList 實現了連結資料表的功能。
java.util.ArrayDeque實現了順序棧和順序隊列(該類中即定義了與棧操作有關的方法,也定義了與隊列操作有關的方法)、java.util.LinkedList實現了連結棧和連結隊列。
2,定義了一個Stack<E>介面,指明該棧實現了哪些具體的操作。介面如下:
1 public interface Stack<E> { 2 public int length();//返回棧的長度 3 4 public E pop();//出棧 5 6 public void push(E element);//進棧 7 8 public E peek();//訪問棧頂元素 9 10 public boolean empty();//判斷棧是否為空白11 12 public void clear();//清空棧13 }
3,在JAVA類庫中,java.util.ArrayDeque類實現了順序棧的功能。ArrayDeque可以實現動態地擴充棧的大小,但是不支援多線程訪問。同時,ArrayDeque還實現了順序隊列的功能。
4,定義了一個Object[] 類型的數組,用來儲存順序棧中的元素。具體實作類別SequenceStack.java 如下:
import java.util.Arrays;public class SequenceStack<E> implements Stack<E> { private int DEFAULT_SIZE = 16;//定義棧的初始預設長度 private int capacity;//儲存順序棧的長度 private int size;//儲存順序棧中元素的個數 private Object[] elementData;//定義一個數組用於儲存順序棧中的元素 public SequenceStack() { capacity = DEFAULT_SIZE; elementData = new Object[capacity]; } //以指定的大小來建立棧 public SequenceStack(int initSize){ capacity = 1; while(capacity < initSize) capacity <<= 1;//將capacity設定成大於initSize的最小2次方 elementData = new Object[capacity]; } //返回當前順序棧中元素的個數 public int length() { return size; } public E pop() { if(empty()) throw new IndexOutOfBoundsException("棧空,不能出棧"); E oldValue = (E)elementData[size - 1]; elementData[--size] = null;//讓記憶體回收行程及時回收,避免記憶體泄露 return oldValue; } public void push(E element) { ensureCapacity(size + 1); elementData[size++] = element; } private void ensureCapacity(int minCapacity){ if(minCapacity > capacity){ while(capacity < minCapacity) capacity <<= 1; elementData = Arrays.copyOf(elementData, capacity); } } //擷取棧頂元素,不會將棧頂元素刪除 public E peek() { if(size == 0) throw new ArrayIndexOutOfBoundsException("棧為空白"); return (E)elementData[size - 1]; } public boolean empty() { return size == 0; } public void clear() {// Arrays.fill(elementData, null); for(int i = 0; i < size; i++) elementData[i] = null; size = 0; } public String toString(){ if(size == 0) return "[]"; else{ StringBuilder sb = new StringBuilder("["); for(int i = size - 1; i >= 0; i--) sb.append(elementData[i].toString() + ", "); int len = sb.length(); //刪除由於上面for迴圈中最後添加的多餘的兩個字元 (一個是逗號,一個是空格符號) return sb.delete(len - 2, len).append("]").toString(); } }}
使用JAVA數組實現順序棧