參照賀巨集巨集老師給的寫的。
順序的和鏈式的。每種的又分為「無序入(正常的尾入),有序出」和「有序入,無序出(正常的頭出)」。思想都很簡單,沒什麼說的。下面只說**實現。
順序的比較簡單,沒什麼說的。
就是鏈式的比較麻煩,第一次寫,真是有些麻煩(其實不難,就是沒做好心理準備,覺得鏈式的應該跟順序的一樣很簡單)。
鏈式的麻煩在於:
1、鍊錶的插入和刪除,都需要先找到它的前乙個,這樣才能"真正的"插入和刪除。但鏈式佇列又是用專門的指標指向它的頭尾的,也就是沒頭節點,這樣的話,那個fri節點找起來就有些麻煩了。
2、鏈式佇列的判空是判斷front指標是否為null,以及鏈式佇列的摧毀有個判斷是判斷front跟rear是否相等。那麼也就需要保持尾節點的next必須為null,並且如果節點為空時,得保持front跟rear都為null。
所以上兩個比較長的函式的**,乙個是"佇列元素為無序狀態"的有序出,乙個是"佇列元素為有序狀態"的有序入。
"佇列元素為無序狀態"的有序出
//獲取隊頭的值,且刪除隊頭
bool popdisorder(ppriiqueue pq, int *rtval)
if (pq->front == pq->rear)//排除只有乙個節點
//下面的都是至少有兩個節點,所以肯定會有個fri
//先將第乙個節點當作"頭節點"用,得到除過第乙個節點外的優先順序最高的那個節點的前乙個節點的位址
qnode *min_fri = pq->front;
for (qnode *i = pq->front; i != pq->rear; i = i->next) }
if (pq->front->priority < min_fri->next->priority)//把上面的得到的優先順序最高的節點跟第乙個節點比較下
if (min_fri->next == pq->rear)//如果優先順序最高的是尾節點,那就需要更新rear的指向
//下面是正式的刪除
*rtval = min_fri->next->data;
qnode *p = min_fri->next;
min_fri->next = p->next;
free(p);
return true;
}
"佇列元素為有序狀態"的有序入
//有序入隊
bool pushorder(ppriiqueue pq, int val, int priority)//將此新來的節點插在比它的優先順序"大"(是大,不是小,也不是等於)的那個節點前面
if (pq->front == pq->rear)//排除只有乙個節點
else
}//下面佇列至少有兩個節點,所以肯定有fri
if (pq->front->priority > p->priority)//排除插在第乙個節點前面的情況
qnode *pos_fri;
for (pos_fri = pq->front; pos_fri != pq->rear; pos_fri = pos_fri->next) }
if (pos_fri == pq->rear)
else
}
佇列 優先順序佇列
優先順序佇列的隊尾是不需要改變的,永遠在低下標處。當佇列增加資料時,隊頭的位置就是資料項的大小減去1.public class priorityq 插入 public void insert long item else quearray j 1 item nitem 刪除 public long ...
優先順序佇列
分為最小優先順序佇列和最大優先順序佇列。優先順序佇列是一種用來維護一組元素構成的集合s的資料結構,這一組元素都有乙個關鍵字key,乙個最大優先順序佇列支援的操作 insert s,x 把x插入到集合s中 maxmum s 返回s中最大元素 extra max s 去掉s中最大關鍵字並返回該最大關鍵子...
優先順序佇列
1 include stdafx.h 2 include3 4 using namespace std 5 6 define max heap len 107 int heap max heap len 8 int heap size 0 the number of elements in heap...