棧與佇列簡介
棧與佇列和陣列、連結串列、樹這幾種資料結構不太一樣。棧與佇列主要是做為程式設計師的工具來使用,它們主要做為構思演算法的輔助工具,而不是完全的資料儲存工具。
它們的生命週期比陣列那些要短得多,在程式執行期間它們才會被建立,任務執行完就會被銷燬。
一 棧
棧是一種只能在一端進行插入和刪除資料的資料結構,這一端被稱為棧頂(top)。其特點簡單來講就是先進後出。棧的主要機制可以用陣列來實現,當然也可以用連結串列來實現。
用陣列實現棧,並完成常用操作——出棧、入棧、檢視元素(只能檢視棧頂元素)、判斷棧是否為空等操作。
public class StackTest {
private long[] arr; // 棧頂 private int top; public StackTest(){ arr = new long[10]; top = -1; } public StackTest(int maxsize){ arr = new long[maxsize]; top = -1; } /** * 新增資料 * @param value */ public void push(int value){ arr[++top] = value; } /** * 移除資料 * @return */ public long pop() { return arr[top--]; } /** * 檢視資料 * @return */ public long peek(){ return arr[top]; } public boolean isEmpty(){ return top == -1; } /*** * 判斷是否滿了 * @return */ public boolean isFull(){ return top == arr.length-1; }
}
棧的所有操作複雜度都為O(1),棧的操作不依賴棧中元素大小,棧不需要移動和比較操作。
二 佇列
佇列的特點是先進先出。佇列也是用陣列來實現。
用陣列實現佇列,並完成常用操作——出隊、入隊、檢視元素、判斷佇列是否為空等操作。
public class QueueTest {
private long[] arr; // 有效資料的大小 private int elements; // 隊頭 private int front; // 隊尾 private int end; public QueueTest(){ arr = new long[10]; elements = 0; front = 0; end = -1; } public QueueTest(int maxsize){ arr = new long[maxsize]; elements = 0; front = 0; end = -1; } /** * 插入資料 * @param value */ public void insert(long value){ arr[++end] = value; elements++; } /** * 刪除資料 * @return */ public long remove(){ elements--; return arr[front++]; } /** * 檢視資料,從對頭檢視 * @return */ public long peek(){ return arr[front]; } /** * 判斷是否為空 * @return */ public boolean isEmpty(){ return elements == 0; } public boolean isFull(){ return elements == arr.length; }
}
佇列的插入、刪除等操作的複雜度都為O(1)。
三 優先順序佇列
優先順序佇列和普通佇列一樣,也是一個隊頭,一個隊尾,從隊頭移除元素,優先順序佇列中,資料項是有序的,這樣插入資料的時候就會根據某種規則去比較,然後插入到佇列合適的位置。因此,優先順序佇列插入的複雜度為O(N),刪除和檢視元素的複雜度為O(1)。
用陣列實現優先順序佇列,並完成常用操作——出隊、入隊、檢視元素、判斷佇列是否為空等操作。
public class FirstQueueTest {
private long[] arr; // 有效資料的大小 private int elements; // 隊頭 private int front; // 隊尾 private int end; public FirstQueueTest(){ arr = new long[10]; elements = 0; front = 0; end = -1; } public FirstQueueTest(int maxsize){ arr = new long[maxsize]; elements = 0; front = 0; end = -1; } /** * 插入資料 * @param value */ public void inser(long value){ if(elements == 0){ arr[++end] = value; elements++; }else{ // 按某種規則進行比較,這裡使用value的大小比較,按從小到大排序 for(int i = elements-1;i>=0;i--){ if(value<arr[i]){ arr[i+1] = arr[i]; arr[i] = value; }else{ arr[i+1] = value; break; } } elements++; end++; } } /** * 刪除資料 * @return */ public long remove(){ elements--; return arr[front++]; } /** * 檢視資料,從對頭檢視 * @return */ public long peek(){ return arr[front]; } /** * 判斷是否為空 * @return */ public boolean isEmpty(){ return elements == 0; } public boolean isFull(){ return elements == arr.length; }
}
四 總結
1.棧的特點是先進後出,棧只能檢視棧頂的一個元素
2.佇列的特點是先進先出,只能檢視隊頭的一個元素
3.優先順序佇列插入一條元素,平均需要移動2/N個元素,因此插入的複雜度為O(N)
4.棧和佇列,可以用陣列實現,也可以用其他資料結構實現
棧和佇列是為了完成某些工作,手動構造的資料結構
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69984138/viewspace-2732359/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java 棧與佇列Java佇列
- 6.13-棧與佇列佇列
- 棧,佇列,優先順序佇列簡單介面使用佇列
- day11 棧與佇列佇列
- 棧-佇列佇列
- 佇列,棧佇列
- 棧、佇列佇列
- 聊聊陣列與連結串列,棧與佇列陣列佇列
- 棧與佇列理論基礎佇列
- 資料結構-棧與佇列資料結構佇列
- 線性結構 佇列與棧佇列
- “棧”與“佇列”呢點事(三)佇列
- “棧”與“佇列”呢點事(一)佇列
- 用JavaScript實現棧與佇列JavaScript佇列
- 棧和佇列佇列
- python資料結構與演算法——棧、佇列與雙端佇列Python資料結構演算法佇列
- 通過佇列實現棧OR通過棧實現佇列佇列
- 堆、棧以及佇列佇列
- 逆波蘭表示式求值——棧與佇列佇列
- java集合類——Stack棧類與Queue佇列Java佇列
- 從簡單的線性資料結構開始:棧與佇列資料結構佇列
- 資料結構與演算法-棧與佇列資料結構演算法佇列
- 9. 題目:對佇列實現棧&用棧實現佇列佇列
- 用棧實現佇列佇列
- 用佇列實現棧佇列
- Chapter 2 棧和佇列APT佇列
- 滑動視窗最大值——棧與佇列佇列
- Day 10| 232.用棧實現佇列 、 225. 用佇列實現棧佇列
- 單調棧/單調佇列佇列
- 資料結構-佇列、棧資料結構佇列
- 《演算法》- 佇列和棧演算法佇列
- 演算法-棧佇列堆演算法佇列
- 連結串列&鏈棧&佇列佇列
- 兩個棧實現佇列佇列
- 三、資料結構演算法-棧、佇列、優先佇列、雙端佇列資料結構演算法佇列
- “簡單”的訊息佇列與kafka佇列Kafka
- 惡補基礎知識:Java 棧與佇列詳解Java佇列
- 結構與演算法(02):佇列和棧結構演算法佇列