英雄聯盟遊戲裡面防禦塔都有乙個自動攻擊功能,小兵排著隊進入防禦塔的攻擊範圍,防禦塔先攻擊靠得最近的小兵,這時候大炮車的優先順序更高(因為系統判定大炮車對於防禦塔的威脅更大),所以防禦塔會優先攻擊大炮車。而當大炮車陣亡,剩下的全部都是普通小兵,這時候離得近的優先順序越高,防禦塔優先攻擊距離更近的小兵。
優先佇列:它的入隊順序沒有變化,但是出隊的順序是根據優先順序的高低來決定的。優先順序高的優先出隊。
空的任務佇列&插入元素
優先佇列出隊
原始碼實現:
1 #include 2 #include 3 #include 4 #include 5 #include 67using
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 這樣的操作刪除元素後,最...
資料結構與演算法 堆 的優先佇列
作業系統核心作業排程是優先佇列的乙個應用例項,它根據優先順序的高低而不是先到先服務的方 式來進行排程 如果最小鍵值元素擁有最高的優先順序,那麼這種優先佇列叫作公升序優先佇列 即總是先刪除最小 的元素 類似的,如果最大鍵值元素擁有最高的優先順序,那麼這種優先佇列叫作降序優先佇列 即總是先刪除最大的元素...