棧與佇列簡介

愛喝啤酒的雷神發表於2020-11-05
棧與佇列和陣列、連結串列、樹這幾種資料結構不太一樣。棧與佇列主要是做為程式設計師的工具來使用,它們主要做為構思演算法的輔助工具,而不是完全的資料儲存工具。

它們的生命週期比陣列那些要短得多,在程式執行期間它們才會被建立,任務執行完就會被銷燬。

一 棧
棧是一種只能在一端進行插入和刪除資料的資料結構,這一端被稱為棧頂(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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章