C C 資料結構和演算法 優先順序佇列

2021-10-05 11:06:22 字數 4130 閱讀 7694

英雄聯盟遊戲裡面防禦塔都有乙個自動攻擊功能,小兵排著隊進入防禦塔的攻擊範圍,防禦塔先 攻擊靠得最近的小兵,這時候大炮車的優先順序更高(因為系統判定大炮車對於防禦塔的威脅更大), 所以防禦塔會優先攻擊大炮車。而當大炮車陣亡,剩下的全部都是普通小兵,這時候離得近的優 先級越高,防禦塔優先攻擊距離更近的小兵。

優先佇列:它的入隊順序沒有變化,但是出隊的順序是根據優先順序的高低來決定的。優先順序高的 優先出隊。

//佇列中元素型別

typedef

struct _qnode //結點結構

qnode;

typedef qnode* queueptr;

typedef

struct queue

linkqueue;

空的任務佇列 & 插入元素

刪除乙個節點

參考:

#include

#include

#include

#include

#include

using

namespace std;

#define maxsize 5

//佇列的最大容量

typedef

int datatype;

//任務佇列中元素的型別

typedef

struct _qnode //節點結構

qnode;

typedef qnode* queueptr;

typedef

struct queue

linkqueue;

//佇列初始化, 將佇列初始化為空佇列

void

initqueue

(linkqueue* lq)

//判斷隊列為空

intisempty

(linkqueue* lq)

return0;

}//判斷佇列是否為滿

intisfull

(linkqueue* lq)

return0;

}//入隊, 將元素 data 插入到佇列lq中

intenterqueue

(linkqueue* lq, datatype data,

int priority)

qnode* qnode =

new qnode;

qnode-

>data = data;

qnode-

>priority = priority;

qnode-

>next =

null;if

(isempty

(lq)

)//空佇列

else

lq->length++

;return1;

}//出隊, 遍歷佇列, 找到佇列中優先順序最高的元素data出隊

intdeletequeue

(linkqueue* lq, datatype* data)if(

!data)

return0;

//prev 指向隊頭 front 指標的位址

prev =

&(lq-

>front)

;printf

("第乙個節點的優先順序: %d\n",(

*prev)

->priority)

; last = lq-

>front;

tmp = last-

>next;

while

(tmp)

last = tmp;

tmp = tmp-

>next;

}*data =

(*prev)

->data;

tmp =

*prev;

*prev =

(*prev)

->next;

delete tmp;

lq->length--

;//接下來存在2種情況需要分別對待

//1. 刪除的首節點, 而且的佇列長度為零

if(lq-

>length ==0)

//2. 刪除尾部節點

if(prev_node && prev_node-

>next ==

null

)return1;

}//列印佇列中的各個元素

void

printqueue

(linkqueue* lq)

tmp = lq-

>front;

while

(tmp)

cout << endl;

}//獲取隊首的元素, 不出隊

intgethead

(linkqueue* lq, datatype* data)if(

!data)

return0;

*data = lq-

>front-

>data;

return1;

}//清空佇列

void

clearqueue

(linkqueue* lq)

lq->front =

null

; lq-

>rear =

null

; lq-

>length =0;

}//獲取佇列中的元素的個數

intgetlength

(linkqueue* lq)

intmain()

//列印佇列中的元素

printf

("佇列中的元素(總共 %d 個): "

,getlength

(lq));

printqueue

(lq)

; cout << endl;

//出隊

for(

int i =

0; i <

5; i++

)else

}//列印佇列中的元素

printf

("出隊 5 個元素後, 佇列中剩下的元素[%d]: \n"

,getlength

(lq));

printqueue

(lq)

; cout << endl;

clearqueue

(lq)

; cout <<

"清空佇列!\n"

<< endl;

printqueue

(lq)

;//清空資源

delete lq;

system

("pause");

return0;

}

編譯環境: vs2019

執行結果:

學到的知識要, 多複習, 多總結, 多敲. 需要時間的積累, 才能引起質的改變. 自己寫不出來的永遠是別人的.

如果說這個知識點分 10 層, 我覺得我現在才 3 層(可能還不到).

分享一下我的技巧: 代數法把具體的數字帶進去, 看看能能能找到規律.

還有就是畫圖, 也很重要. 用筆畫出來, 把數代進去, 方法雖然笨, 但真的很實用, 好記憶不如爛筆頭!!!

我是小白, 如果存在問題, 歡迎大神給予評判指正.

錯了不可怕, 可怕的是找不出bug

希望給個贊: 反正你又不虧, 順便而已

青春勵志: 真正的強者, 不是流淚的人, 而是含淚奔跑的人.

名詞新意: [現實] 一種與想象截然相反的生活.

優先順序佇列 資料結構和演算法

優先順序佇列 在優先順序佇列中,資料項按關鍵字的值有序,這樣關鍵字最小的資料項 或最大 總是在 隊頭。資料項插入時會按照順序插入到合適的位置以確保佇列的順序。package test13 priorityqueue created by mlink on 2017 3 17.public class...

資料結構 優先順序佇列

設初始序列為 49,38,65,97,76 大根堆 父節點的值大於或等於子節點的值 令數值越大優先順序越高 此時堆頂的元素為所有元素的最大值 97 小根堆 父節點的值小於或等於子節點的值 令數值越小優先順序越高 此時堆頂的元素為所有元素的最小值 38 將佇列中的所有元素按從大到小的數值輸出 分析 因...

資料結構 優先順序佇列

優先佇列的底層實現 二叉堆實現優先順序佇列 練習優先順序佇列也屬於佇列,因此也提供以下介面 利用二叉堆作為優先佇列的底層實現 可以通過comparator或comparable去自定義優先順序高低 利用二叉堆實現優先順序佇列。二叉堆實現優先順序佇列 author yusael public clas...