04-圖解資料結構之棧--Stack
零、前言
棧是一種線性的資料結構
特性:僅棧頂元素可見、後進先出LIFO
操作:push入棧 pop彈棧 peek檢視棧頂元素

棧.png
棧的陣列實現
一、棧的介面
/** * 作者:張風捷特烈 * 時間:2018/8/17 0017:12:49 * 郵箱:[email protected] * 說明:棧的介面 */ public interface IStack<T>{ /** * 棧元素個數 * @return棧元素個數 */ int size(); /** * 棧元素容積 * @return 容積 */ int capacity(); /** * 是否為空 * @return是否為空 */ boolean isEmpty(); /** * 入棧 * @param el 元素 */ void push(T el); /** * 出棧 * @return 元素 */ T pop(); /** * 取出元素 * @return 元素 */ T peek(); }
二、棧的陣列實現:陣列總結見第01篇
/** * 作者:張風捷特烈 * 時間:2018/8/17 0017:12:56 * 郵箱:[email protected] * 說明:棧的陣列實現 */ public class ArrayGroupStack<T> implements IStack<T> { /** * 成員變數 */ private ArrayGroup<T> array; public ArrayGroupStack(int capacity) { array = new ArrayGroup<>(capacity); } public ArrayGroupStack() { array = new ArrayGroup<>(); } @Override public int size() { return array.size(); } @Override public int capacity() { return array.getCapacity(); } @Override public boolean isEmpty() { return array.isEmpty(); } @Override public T pop() { return array.removeLast(); } @Override public void push(T el) { array.addLast(el); } @Override public T peek() { return array.get(size() - 1); } @Override public String toString() { StringBuilder res = new StringBuilder(); res.append("Stack :"); res.append("[ "); for (int i = 0; i < array.size(); i++) { res.append(array.get(i)); if (i != array.size() - 1) { res.append(", "); } } res.append("] <--top"); return res.toString(); } }
陣列棧測試
private static void arrayStackTest() { ArrayGroupStack<Integer> arrayGroupStack = new ArrayGroupStack<>(); for (int i = 0; i < 5; i++) { arrayGroupStack.push(i); System.out.println(arrayGroupStack); } arrayGroupStack.pop(); arrayGroupStack.pop(); Integer peek = arrayGroupStack.peek(); System.out.println(peek); } //Stack :[ 0] <--top //Stack :[ 0, 1] <--top //Stack :[ 0, 1, 2] <--top //Stack :[ 0, 1, 2, 3] <--top //Stack :[ 0, 1, 2, 3, 4] <--top //2
三、連結串列實現棧 :連結串列總結見第02篇
/** * 作者:張風捷特烈 * 時間:2018/8/17 0017:22:40 * 郵箱:[email protected] * 說明:棧的連結串列式集合實現 */ public class SingleLinkedStack<E> implements IStack<E> { private SingleLinkedGroup<E> mLinkedGroup; public SingleLinkedStack() { mLinkedGroup = new SingleLinkedGroup<>(); } @Override public int size() { return mLinkedGroup.size(); } @Override public int capacity() { return mLinkedGroup.size(); } @Override public boolean isEmpty() { return mLinkedGroup.isEmpty(); } @Override public void push(E el) { mLinkedGroup.addFirst(el); } @Override public E pop() { return mLinkedGroup.removeFirst(); } @Override public E peek() { return mLinkedGroup.get(0); } @Override public String toString() { StringBuilder res = new StringBuilder(); res.append("SingleLinkedStack Stack :"); res.append(mLinkedGroup); return res.toString(); } }
測試:
/** * 連結串列式集合實現的棧測試方法 */ private static void linkStackTest() { SingleLinkedStack<Integer> linkedStack = new SingleLinkedStack<>(); for (int i = 0; i < 5; i++) { linkedStack.push(i); System.out.println(linkedStack); } linkedStack.pop(); linkedStack.pop(); Integer peek = linkedStack.peek(); System.out.println(peek); //SingleLinkedStack Stack :head: 0->NULL //SingleLinkedStack Stack :head: 1->0->NULL //SingleLinkedStack Stack :head: 2->1->0->NULL //SingleLinkedStack Stack :head: 3->2->1->0->NULL //SingleLinkedStack Stack :head: 4->3->2->1->0->NULL //2 }
四、連結串列和陣列實現棧的比較
陣列棧:ArrayGroupStack測試
方法\數量 |複雜度 |1000次|10000次|10W次|100W次|1000W次
--- |---|---|---|---|---|---|---
push | O(1)|0.0011秒|0.0034秒|0.0158秒|0.0726秒|1.020秒
pop| O(1)|0.0006秒|0.0025秒|0.0085秒|0.0280秒|0.1751秒
peek | O(1)|--|--|--|--|--|
連結串列棧:SingleLinkedStack測試
方法\數量 |複雜度 |1000次|10000次|10W次|100W次|1000W次
--- |---|---|---|---|---|---|---
push | O(1)|0.0005秒|0.0027秒|0.0075秒|0.3817秒|3.1550秒
pop| O(1)|0.0004秒|0.0022秒|0.0050秒|0.0223秒|0.1267秒
peek | O(1)|--|--|--|--|--|
後記、
1.宣告:
[1]本文由張風捷特烈原創,各圖均由本人親自所畫,轉載請註明
[2]歡迎廣大程式設計愛好者共同交流
[3]個人能力有限,如有不正之處歡迎大家批評指證,必定虛心改正
[4]你的喜歡與支援將是我最大的動力
2.連線傳送門:
ofollow,noindex">更多資料結構知識歡迎訪問:圖解資料結構 專案原始碼均在我的https://github.com/toly1994328/DS:歡迎star 張風捷特烈個人網站,程式設計筆記請訪問: http://www.toly1994.com
3.聯絡我
QQ:1981462002
微信:zdl1994328
4.歡迎關注我的微信公眾號,最新精彩文章,及時送達:

公眾號.jpg