数据结构— —优先队列

简介: 数据结构— —优先队列

英雄联盟游戏里面防御塔都有一个自动攻击功能,小兵排着队进入防御塔的攻击范围,防御塔先攻击靠得最近的小兵,这时候大炮车的优先级更高(因为系统判定大炮车对于防御塔的威胁更大),所以防御塔会优先攻击大炮车。而当大炮车阵亡,剩下的全部都是普通小兵,这时候离得近的优先级越高,防御塔优先攻击距离更近的小兵。


33b742792020466caea672fb609503e9.png

typedef int DataType; //队列中元素类型
typedef struct _QNode 
{ //结点结构 
    int priority; //每个节点的优先级,9最高优先级,0最低优先级,优先级相同,取第一个节点
    DataType data; 
    struct _QNode *next;
}QNode;

优先队列它的入队顺序没有变化,但是出队的顺序是根据优先级的高低来决定的。优先级高的优先出队。

83c52823d0d24c439c6ccb33e633bb76.png

typedef QNode * QueuePtr;
typedef struct Queue
{
  int length; //队列的长度
  QueuePtr front; //队头指针
  QueuePtr rear;  //队尾指针
}LinkQueue; 11


空的任务队列 插入元素



16ad01bd66204076961a0c0b41bf2687.jpg

删除一个节点


def074f992a54de4981b446550e7f6b2.png


优先队列出队


00fc9b0b56ef4c2eb4a2bf7b3c104b3c.png




完整代码:

#include <stdio.h>
#include <assert.h>
#include <Windows.h>
#include <iostream> 
#include <iomanip> 
using namespace std;
#define MaxSize 5 //队列的最大容量 
typedef int DataType; //任务队列中元素类型
typedef struct _QNode 
{ 
//结点结构 
int priority; //每个节点的优先级,0最低优先级,9最高优先级,优先级相同,取第一个节点
DataType data; 
struct _QNode *next;
}QNode; 
typedef QNode * QueuePtr;
typedef struct Queue
{
    int length; //队列的长度
  QueuePtr front; //队头指针
  QueuePtr rear;  //队尾指针
}LinkQueue;
//队列初始化,将队列初始化为空队列
void InitQueue(LinkQueue *LQ)
{ 
    if(!LQ) return ;
    LQ->length = 0;
    LQ->front = LQ->rear = NULL; //把对头和队尾指针同时置0
}
//判断队列为空
int IsEmpty(LinkQueue *LQ)
{ 
    if(!LQ) return 0;
    if (LQ->front == NULL)
    {
        return 1;
    } 
    return 0;
}
//判断队列是否为满
int IsFull(LinkQueue *LQ)
{ 
    if(!LQ) return 0;
    if (LQ->length == MaxSize)
    { 
        return 1;
    } 
    return 0;
}
//入队,将元素data插入到队列LQ中
int EnterQueue( LinkQueue *LQ,DataType data, int priority)
{ 
    if(!LQ) return 0;
    if(IsFull(LQ))
    {
        cout<<"无法插入元素 "<<data<<", 队列已满!"<<endl; 
        return 0;
    }
    QNode *qNode = new QNode; 
    qNode->data = data; 
    qNode->priority = priority; 
    qNode->next = NULL;
    if(IsEmpty(LQ))
    {//空队列
        LQ->front = LQ->rear = qNode;
    }
    else 
    {
        LQ->rear->next =qNode;//在队尾插入节点qNode
      LQ->rear = qNode; //队尾指向新插入的节点
    }
    LQ->length++;
    return 1;
}
//出队,遍历队列,找到队列中优先级最高的元素data出队
int DeleteQueue(LinkQueue *LQ, DataType *data)
{
    QNode **prev = NULL, *prev_node=NULL;//保存当前已选举的最高优先级节点上一个节点的指针地址。
    QNode *last = NULL, *tmp = NULL;
    if(!LQ || IsEmpty(LQ))
    {
        cout<<"队列为空!"<<endl;
        return 0; 
    }
    if(!data) return 0;
    //prev 指向队头front 指针的地址
    prev = &(LQ->front);
    printf("第一个节点的优先级: %d\n", (*prev)->priority);
    last = LQ->front; 
    tmp = last->next; 
    while(tmp)
    { 
        if(tmp->priority >(*prev)->priority)
    {
        printf("抓到个更大优先级的节点[priority: %d]\n",tmp->priority); 
        prev = &(last->next); prev_node= last;
    } 
    last=tmp; 
    tmp=tmp->next;
    }
    *data = (*prev)->data; 
    tmp = *prev; *prev = (*prev)->next; 
    delete tmp;
    LQ->length--;
    //接下来存在2种情况需要分别对待 
    //1.删除的是首节点,而且队列长度为零
    if(LQ->length==0)
    {
        LQ->rear=NULL;
    }
    //2.删除的是尾部节点
    if(prev_node&&prev_node->next==NULL)
    {
        LQ->rear=prev_node;
    }
        return 1;
}
//打印队列中的各元素
void PrintQueue(LinkQueue *LQ) 
{ 
    QueuePtr tmp; if(!LQ) return ;
    if(LQ->front==NULL)
    {
        cout<<"队列为空!"; return ; 
    }
    tmp = LQ->front; 
    while(tmp)
    { 
        cout<<setw(4)<<tmp->data<<"["<<tmp->priority<<"]";
        tmp = tmp->next;
    } 
        cout<<endl;
}
//获取队首元素,不出队
int GetHead(LinkQueue *LQ,DataType *data)
{ 
    if (!LQ || IsEmpty(LQ))
    { 
        cout<<"队列为空!"<<endl;
        return 0; 
    } 
    if(!data) return 0;
    *data = LQ->front->data; 
    return 1;
}
//清空队列
void ClearQueue(LinkQueue *LQ)
{ 
    if(!LQ) return ;
    while(LQ->front)
    {
        QueuePtr tmp = LQ->front->next; 
        delete LQ->front; 
        LQ->front = tmp; 
    }
    LQ->front = LQ->rear = NULL;
    LQ->length = 0;
}
//获取队列中元素的个数
int getLength(LinkQueue* LQ)
{ 
    if(!LQ) return 0;
    return LQ->length;
}
int main()
{
    LinkQueue *LQ = new LinkQueue; 
    DataType data = -1;
    //初始化队列
    InitQueue(LQ);
    //入队
    for(int i=0; i<5; i++)
    {
        EnterQueue(LQ, i+10, i);
    }
    //打印队列中的元素
    printf("队列中的元素(总共%d 个):", getLength(LQ));
    PrintQueue(LQ); cout<<endl;
    //出队
    for(int i=0; i<5; i++)
    { 
        if(DeleteQueue(LQ, &data))
        { 
            cout<<"出队的元素是:"<<data<<endl;
        }
        else 
        { 
            cout<<"出队失败!"<<endl;
    }
}
    //打印队列中的元素
    printf("出队五个元素后,队列中剩下的元素[%d]:\n",getLength(LQ));
    PrintQueue(LQ); 
    cout<<endl;
    ClearQueue(LQ); 
    cout<<"清空队列!\n";
    PrintQueue(LQ);
    //清理资源 delete LQ;
    system("pause"); 
    return 0;
}


相关文章
|
6月前
|
存储
【每日一题Day190】LC1172餐盘栈 | 优先队列
【每日一题Day190】LC1172餐盘栈 | 优先队列
66 0
|
4月前
|
算法 安全 大数据
揭秘!Python堆与优先队列:数据结构的秘密武器,让你的代码秒变高效战士!
【7月更文挑战第8天】Python的heapq模块和queue.PriorityQueue提供堆与优先队列功能,助你提升算法效率。堆用于快速找大数据集的第K大元素,如示例所示,时间复杂度O(n log k)。PriorityQueue在多线程中智能调度任务,如模拟下载管理器,按优先级处理任务。掌握这些工具,让代码运行更高效!
71 1
|
5月前
|
算法 C++
数据结构与算法===优先队列
数据结构与算法===优先队列
数据结构与算法===优先队列
|
4月前
|
存储 算法 调度
惊呆了!Python高级数据结构堆与优先队列,竟然能这样优化你的程序性能!
【7月更文挑战第10天】Python的heapq模块实现了堆和优先队列,提供heappush和heappop等函数,支持O(log n)时间复杂度的操作。优先队列常用于任务调度和图算法,优化性能。例如,Dijkstra算法利用最小堆加速路径查找。堆通过列表存储,内存效率高。示例展示了添加、弹出和自定义优先级元素。使用堆优化程序,提升效率。
60 2
|
4月前
|
算法 Java 调度
优先队列在数据结构中的作用与实现方式
优先队列在数据结构中的作用与实现方式
|
4月前
|
算法 安全 调度
逆天改命!Python高级数据结构堆(Heap)与优先队列,让你的算法效率飙升至宇宙级!
【7月更文挑战第8天】Python的heapq模块和queue.PriorityQueue实现了堆和优先队列,提供高效算法解决方案。堆用于Dijkstra算法求解最短路径,例如在图论问题中;PriorityQueue则在多线程下载管理中确保高优先级任务优先执行。这两个数据结构提升效率,简化代码,是编程中的强大工具。
50 0
|
4月前
|
安全 调度 Python
Python堆与优先队列:不只是数据结构,更是你编程路上的超级加速器!
【7月更文挑战第8天】Python的heapq模块和queue.PriorityQueue提供堆与优先队列功能。堆,作为完全二叉树,支持排序性质,heapq用于单线程操作;PriorityQueue在多线程中保证安全。通过示例展示了如何插入、删除任务,以及在多线程任务调度中的应用。堆与优先队列是高效编程的关键工具,提升代码性能与并发处理能力。
39 0
|
4月前
|
存储 算法 安全
解锁Python高级数据结构新姿势:堆与优先队列的实战演练,让你的代码更优雅!
【7月更文挑战第8天】Python的`heapq`模块和`queue.PriorityQueue`提供堆与优先队列功能,用于高效数据管理。堆是完全二叉树,`heapq`实现最小堆,常用于任务调度,如按优先级执行任务。当需要线程安全且更复杂操作时,`queue.PriorityQueue`成为优选,例如在管理网络请求时按优先级处理。这两个数据结构能提升代码效率和可读性。
39 0
|
5月前
|
存储
数据结构学习记录——什么是堆(优先队列、堆的概念、最大堆最小堆、优先队列的完全二叉树表示、堆的特性、堆的抽象数据类型描述)
数据结构学习记录——什么是堆(优先队列、堆的概念、最大堆最小堆、优先队列的完全二叉树表示、堆的特性、堆的抽象数据类型描述)
127 2
|
5月前
|
存储 算法 索引
心得经验总结:数据结构(八):优先队列
心得经验总结:数据结构(八):优先队列
17 0