資料結構與演算法 優先佇列

2022-06-03 16:48:12 字數 4120 閱讀 8796

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

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

空的任務佇列&插入元素

優先佇列出隊

原始碼實現:

1 #include 2 #include 3 #include 4 #include 5 #include 6

7using

namespace

std;89

#define maxsize 5 //

佇列的最大容量

10 typedef int datatype; //

任務佇列中元素型別

1112

//結點結構

13 typedef struct

_qnode

14qnode;

1920 typedef qnode*queueptr;

2122

//佇列

23 typedef struct

queue

24linkqueue;

2930

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

31void initqueue(linkqueue*lq)

3237

38//

判斷隊列為空

39int isempty(linkqueue*lq)

40 return0;

46}4748

//判斷佇列是否為滿

49int isfull(linkqueue*lq)

50 return0;

56}5758

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

59int enterqueue(linkqueue* lq, datatype data, int

priority)

6066 qnode* qnode = new

qnode;

67 qnode->data =data;

68 qnode->priority =priority;

69 qnode->next =null;

70if (isempty(lq)) //

空佇列71

74else

7579 lq->length++;

80return1;

81}8283

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

84int deletequeue(linkqueue* lq, datatype*data)

8594

if (!data) return0;

9596

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

97 prev = &(lq->front);

98 printf("

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

", (*prev)->priority);

99100 last = lq->front; //

指向第乙個節點

101 tmp = last->next; //

指向第二個節點

102while

(tmp)

103110

//兩指標後移

111 last =tmp;

112 tmp = tmp->next;

113}

114 *data = (*prev)->data; //

獲取最大優先節點的資料

115 tmp = *prev;

116 *prev = (*prev)->next;

117delete

tmp;

118 lq->length--;

119120

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

121//

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

122if (lq->length == 0

)123

126//

2.刪除的是尾部節點

127if (prev_node && prev_node->next ==null)

128131

return1;

132}

133134

//列印佇列中的各元素

135void printqueue(linkqueue*lq)

136144

145 tmp = lq->front; while

(tmp)

146150 cout <

151}

152153

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

154int gethead(linkqueue* lq, datatype*data)

155 if (!data) return0;

161 *data = lq->front->data;

162return1;

163}

164165

//清空佇列

166void clearqueue(linkqueue*lq)

167175 lq->front = lq->rear =null;

176 lq->length = 0

;177

}178

179//

獲取佇列中元素的個數

180int getlength(linkqueue*lq)

181185

186int

main()

187196

//列印佇列中的元素

197 printf("

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

", getlength(lq));

198printqueue(lq);

199 cout <

200201

//出隊

202for (int i = 0; i < 5; i++)

203208

else

209212

}213

//列印佇列中的元素

214 printf("

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

", getlength(lq));

215printqueue(lq);

216 cout <

217clearqueue(lq);

218 cout << "

清空佇列!\n";

219printqueue(lq);

220221

//清理資源

222delete

lq;223 system("

pause");

224return0;

225 }

資料結構與演算法 優先佇列

優先佇列按照佇列的方式正常入隊,但按照優先順序出隊。有兩種實現方式 堆 二插堆 多項式堆等等 和二叉搜尋樹。這裡重點講解二叉堆,關於二叉搜尋樹的內容見這篇文章。堆是一種特殊的完全二叉樹。大根堆 完全二叉樹的任一節點都比其孩子節點大。小根堆 完全二叉樹的任一節點都比其孩子節點小。堆的向下調整 假設根節...

資料結構與演算法 複習 堆 優先佇列

插入演算法 該演算法從優先佇列的序列去觀察,比較直觀。首先把要插入的元素放在隊尾temp裡。從佇列的最後乙個元素,逐次向前尋找父節點,空位隨之移動,當到達隊頭,或者當前元素小於temp元素時,即可插入。刪除演算法 刪除最小元素,也就是最頭的元素。當我們利用 當前元素數量 1 這樣的操作刪除元素後,最...

資料結構與演算法 堆 的優先佇列

作業系統核心作業排程是優先佇列的乙個應用例項,它根據優先順序的高低而不是先到先服務的方 式來進行排程 如果最小鍵值元素擁有最高的優先順序,那麼這種優先佇列叫作公升序優先佇列 即總是先刪除最小 的元素 類似的,如果最大鍵值元素擁有最高的優先順序,那麼這種優先佇列叫作降序優先佇列 即總是先刪除最大的元素...