我们在打王者或者英雄联盟时,游戏中的防御塔总是先打大炮车,打完大炮车再打小兵。这里就用到优先队列,大炮车的优先级高,小兵的优先级低,所有防御塔会优先打大炮车。
优先队列大部分和链式队列一样,只是出队方式和链式队列骚骚有点区别。
不说了,上代码
#include <iostream>
#define MAX_SIZE 5
using namespace std;
typedef int DataType;
typedef struct _QNode
{
int priority;
DataType data;
struct _QNode* next;
}QNode;
typedef QNode* QueuePtr;
typedef struct
{
int length;
QueuePtr front;
QueuePtr rear;
}LinkQueue;
//初始化
bool initQueue(LinkQueue* &LQ)
{
LQ = new LinkQueue;
if (!LQ) return false;
LQ->length = 0;
LQ->front = LQ->rear = NULL;
return true;
}
//判断是否为空
bool isEmpty(LinkQueue* &LQ)
{
if (!LQ || LQ->length == 0) return true;
return false;
}
//判断是否为满
bool isFull(LinkQueue*& LQ)
{
if (!LQ) return false;
if (LQ->length == MAX_SIZE) return true;
return false;
}
//入队
bool enterQueue(LinkQueue*& LQ, DataType data, int priority)
{
if (!LQ) return false;
if (isFull(LQ))
{
cout << "队列已满" << endl;
return false;
}
QueuePtr tmp = new QNode;
tmp->data = data;
tmp->priority = priority;
tmp->next = NULL;
if (isEmpty(LQ))
{
LQ->front = LQ->rear = tmp;
}
else
{
LQ->rear->next = tmp;
LQ->rear = tmp;
}
LQ->length++;
return true;
}
//输出
void printQueue(LinkQueue*& LQ)
{
if (!LQ || isEmpty(LQ)) {
cout << "队列为空!" << endl;
return;
}
QueuePtr tmp = NULL;
tmp = LQ->front;
while (tmp)
{
cout << tmp->data << "\t";
tmp = tmp->next;
}
cout << endl;
}
//出队
bool deleteQueue(LinkQueue*& LQ,DataType *data)
{
if (!LQ || isEmpty(LQ)) return false;
if (!data) return false;
QNode **prev = NULL, *prev_node = NULL;
QNode *last = NULL, *tmp = NULL;
prev = &(LQ->front);
cout << "第一个节点的优先级:" << (*prev)->priority << endl;
last = LQ->front;
tmp = last->next;
while (tmp)
{
if (tmp->priority > (*prev)->priority)
{
cout << "抓到个更大优先级的节点,priority:"
<< tmp->priority << endl;
prev = &last->next;
prev_node = last;
}
last = tmp;
tmp = tmp->next;
}
*data = (*prev)->data;
tmp = *prev;
*prev = tmp->next;
delete tmp;
LQ->length--;
//1.删除的是首节点
if (LQ->length == 0) LQ->rear = LQ->front = NULL;
//2.删除的是尾部节点
if (prev_node && prev_node->next==NULL)
{
LQ->rear = prev_node;
}
return true;
}
int getLength(LinkQueue* &LQ)
{
if (!LQ || isEmpty(LQ)) return 0;
return LQ->length;
}
//清除
void clearQueue(LinkQueue*& LQ)
{
if (!LQ) return;
QueuePtr tmp = NULL;
while (LQ->front)
{
tmp = LQ->front;
LQ->front =tmp->next;
delete tmp;
}
LQ->front = LQ->rear = NULL;
LQ->length = 0;
}
int main()
{
LinkQueue* LQ;
DataType data = -1;
initQueue(LQ);
for (int i = 0; i < 10; i++)
{
if (enterQueue(LQ,i+10,i))
{
cout << "入队成功!" << endl;
}
else
{
cout << "入队失败!" << endl;
}
}
cout << "队列长度:" << getLength(LQ) << endl;
printQueue(LQ);
for (int i = 0; i < 3; i++)
{
if (deleteQueue(LQ, &data))
{
cout << "元素:" << data << "成功出队!" << endl;
}
else
{
cout << "出队失败" << endl;
}
}
printQueue(LQ);
cout << "队列长度:" << getLength(LQ) << endl;
system("pause");
return 0;
}
打印:
如果出现二级指针错误,可以看一下:
二级指针常见错误