`

SeqPriorityQueue——顺序优先级队列

 
阅读更多

PS:

1、不用考虑“假溢出”的情况。

2、出队列时间复杂度为O(n)。将出队列元素后的元素均往前移1个索引。

/*
** File name: SeqPriorityQueue.h
** Author: ZhouFeng
** Date: 2012/03/29
*/
#ifndef SEQ_PRIORITY_QUEUE_H
#define SEQ_PRIORITY_QUEUE_H

#define BOOL int
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define SUCCESS 1
#define MAX_SIZE 100

typedef int EleType;

typedef struct QueueEle
{
    int nPriority;
    EleType data;
}QueueEle;

typedef struct SeqPriorityQueue
{
    QueueEle aSPQueue[MAX_SIZE];
    int nRear;
    int nCount;
}SeqPriorityQueue;

void InitSPQ(SeqPriorityQueue *SPQ);
int SPQAppend(SeqPriorityQueue *SPQ, QueueEle queueEle);
int SPQDelete(SeqPriorityQueue *SPQ, QueueEle *pQueueElement);
BOOL IsSPQEmpty(SeqPriorityQueue *SPQ);
int GetSPQ(SeqPriorityQueue *SPQ, QueueEle *pQueueElement);

#endif


/*
** File name: SeqPriorityQueue.h
** Author: ZhouFeng
** Date: 2012/03/29
*/
#include <stddef.h>
#include <stdlib.h>
#include "SeqPriorityQueue.h"

void InitSPQ(SeqPriorityQueue *SPQ)
{
    int i = 0;
    
    if(SPQ == NULL)
    {
	return;
    }

    for(i = 0; i < MAX_SIZE; ++i)
    {
	(SPQ->aSPQueue)[i].nPriority = 0;
	(SPQ->aSPQueue)[i].data = 0;
    }
    SPQ->nRear = 0;
    SPQ->nCount = 0;
}

int SPQAppend(SeqPriorityQueue *SPQ, QueueEle queueEle)
{
    if(SPQ == NULL || SPQ->nCount >= MAX_SIZE)
    {
	return ERROR;
    }

    (SPQ->aSPQueue)[SPQ->nRear] = queueEle;
    ++(SPQ->nRear);
    ++(SPQ->nCount);

    return SUCCESS;
}

int SPQDelete(SeqPriorityQueue *SPQ, QueueEle *pQueueElement)
{
    int index = 0;
    int nMaxPriority = 0;
    int nMaxIndex = 0;
    
    if(SPQ == NULL || SPQ->nCount <= 0 || pQueueElement == NULL)
    {
	return ERROR;
    }

    /* Get the Max priority index. */
    nMaxPriority = (SPQ->aSPQueue)[0].nPriority;
    for(index = 1; index < SPQ->nCount; ++index)
    {
	if(nMaxPriority > (SPQ->aSPQueue)[index].nPriority)
	{
	    nMaxPriority = (SPQ->aSPQueue)[index].nPriority;
	    nMaxIndex = index;
	}
	else
	{
	    continue;
	}
    }

    (*pQueueElement).nPriority = nMaxPriority;
    (*pQueueElement).data = (SPQ->aSPQueue)[nMaxIndex].data;

    for(index = nMaxIndex + 1; index < SPQ->nCount; ++index)
    {
	(SPQ->aSPQueue)[index - 1] = (SPQ->aSPQueue)[index];
    }

    --(SPQ->nCount);

    return SUCCESS;
}

BOOL IsSPQEmpty(SeqPriorityQueue *SPQ)
{
    if(SPQ == NULL)
    {
	return TRUE;
    }

    if(SPQ->nCount == 0)
    {
	return TRUE;
    }
    else
    {
	return FALSE;
    }
}

int GetSPQ(SeqPriorityQueue *SPQ, QueueEle *pQueueElement)
{
    int index = 0;
    int nMaxPriority = 0;
    int nMaxIndex = 0;
    
    if(SPQ == NULL || SPQ->nCount <= 0 || pQueueElement == NULL)
    {
	return ERROR;
    }

    /* Get the Max priority index. */
    nMaxPriority = (SPQ->aSPQueue)[0].nPriority;
    for(index = 1; index < SPQ->nCount; ++index)
    {
	if(nMaxPriority > (SPQ->aSPQueue)[index].nPriority)
	{
	    nMaxPriority = (SPQ->aSPQueue)[index].nPriority;
	    nMaxIndex = index;
	}
	else
	{
	    continue;
	}
    }

    (*pQueueElement).nPriority = nMaxPriority;
    (*pQueueElement).data = (SPQ->aSPQueue)[nMaxIndex].data;

    return SUCCESS;
}


测试程序:

#include <stdio.h>
#include "SeqPriorityQueue.h"

int main(int argc, char *argv[])
{
    SeqPriorityQueue SPQ;
    QueueEle qe;
    int i = 0;
    
    InitSPQ(&SPQ);
    printf("[Original]\nPriority   Data\n");
    printf("--------- -------\n");
    for(i = 0; i < MAX_SIZE / 2; ++i)
    {
	qe.nPriority = MAX_SIZE / 2 - i;
	qe.data = i;
	SPQAppend(&SPQ, qe);
	printf("%5d%10d\n", qe.nPriority, qe.data);
    }

    for(i = 50; i < MAX_SIZE; ++i)
    {
	qe.nPriority = MAX_SIZE - i;
	qe.data = i;
	SPQAppend(&SPQ, qe);
	printf("%5d%10d\n", qe.nPriority, qe.data);
    }
    printf("\n");

    printf("[Get Queue]\nPriority   Data\n");
    printf("--------- -------\n");
    while(!IsSPQEmpty(&SPQ))
    {
	SPQDelete(&SPQ, &qe);
	printf("%5d%10d\n", qe.nPriority, qe.data);
    }

    return 0;
}


GDB调试:clear清除断点、u跳出循环。

分享到:
评论

相关推荐

    队列的应用:优先级队列

    使用顺序存储实现优先级队列,展示优先级队列和普通队列的区别之处。

    操作系统——动态优先级调度算法源代码.rar_优先级_优先级调度_优先级调度算法_动态优先级_动态优先级 算法

    操作系统——动态优先级调度算法源代码,多道系统中多进程并发执行,为了提高系统性能解决进程死锁问题,进程的优先级是动态变化的。正在执行的进程优先级会随时间降低,而挂起的进程或等待的进程的优先级会逐渐升高...

    优先级队列

    与普通队列遵循“先进先出”(FIFO)原则不同,优先级队列依据元素的优先级进行出队操作,而不是按照它们被插入的顺序。优先级高的元素会优先被处理,这使得这种数据结构特别适合处理紧急任务或者高优先级的任务。 ...

    数据与算法:2基本数据结构7-优先级队列.pdf

    优先级队列的应用非常广泛,例如在银行贵宾卡服务、Windows消息队列、个人事务处理等领域都可以使用优先级队列来管理任务的执行顺序。 优先级队列的抽象数据类型(Abstract Data Type,ADT)定义了优先级队列的基本...

    数据结构课设——小大根交替堆实现的双端优先级队列及应用

    数据结构课设——小大根交替堆实现的双端优先级队列及应用 小大根交替堆是一种特殊的堆结构,它可以同时满足大根堆和小根堆的性质。在本文中,我们将对小大根交替堆实现的双端优先级队列进行详细的分析和设计。 ...

    操作系统作业————优先级调度算法

    优先级调度算法 #include "iostream.h" #include "stdio.h" #include "stdlib.h" #include "string.h" #include "windows.h" #define MAX_PROGRAM 50 //系统可承受最大进程数量 char pname[MAX_PROGRAM][5]={"P1",...

    进程调度——最高优先级简易模拟系统

    在操作系统设计中,进程调度是核心功能之一,用于...在实际的"进程调度——最高优先级简易模拟系统"项目中,可以结合具体的需求和条件,构建一个模型来演示和分析HPF调度的效果,进一步加深对操作系统调度机制的理解。

    操作系统实验——动态优先级进程调度实验报告.doc

    操作系统实验——动态优先级进程调度实验报告 本实验报告的主要内容是基于动态优先权的进程调度算法,使用C语言编程模拟调度过程中每个时间片内的就绪队列。实验的主要目的是通过模拟动态优先权的进程调度算法,...

    一个用堆实现的优先级队列

    优先级队列是一种特殊的数据结构,它按照优先级顺序存储元素,最高优先级的元素总是在队列的前端。在计算机科学中,堆通常被用来实现优先级队列。堆是一种完全二叉树,其中每个父节点的值都大于或等于(最大堆)或...

    附录3——运算符优先级表1

    以下是对附录3——运算符优先级表1的详细解释: 1. **运算符优先级**: - 最高优先级的运算符包括括号()`()`, 一元运算符如`++`, `--`, `-`, `sizeof`, `&`, `!`, `(type)`,它们的优先级最高,且从右向左结合,即...

    优先级队列(堆实现)

    - 优先级队列不保证元素的顺序,除非它们天然具有可比较性,或者在插入时提供了Comparator。 - `PriorityQueue`不支持随机访问,只能按优先级顺序访问元素。 - 如果试图插入不可比较的元素(例如,两个元素没有公共...

    第10章-优先级队列2

    在这些问题中,数据对象的优先级关系是非常重要的,它直接影响着数据对象的访问和操作顺序。 例如,在医疗救治中,病人的优先级关系取决于病情的轻重缓急。如果按照“先进先出”的原则,那么骨折病人可能需要等待很...

    c语言实现优先级队列

    用c语言实现的,简单易懂,希望对大家有用。

    优先级队列cpp文件PriorityQueue.cpp

    优先级队列cpp文件PriorityQueue.cpp

    priority queue优先级队列

    算法中优先级队列问题...用堆排序的算法来做的例子

    基于双端堆实现的优先级队列

    dheap(插入元素)、pop_max_dheap(删除最大元素)、pop_min_dheap(删除最小元素),is_dheap(堆验证)五个泛型算法,在此基础上实现了一个能在对数时间内获取最大和最小元素的优先级队列,相当于原stl优先级队列...

    毕业设计MATLAB_优先级队列.zip

    例如,在模拟调度系统中,任务可以根据它们的截止时间或紧急程度被赋予不同的优先级,优先级队列可以帮助高效地安排执行顺序。在图算法中,可以使用优先级队列来存储待处理的节点,优先级依据节点的权重或距离来设定...

    第10章-优先级队列1

    在数据结构中,优先级队列是一种特殊的队列,队列中的每个元素都有一个优先级,队列的出队顺序是按照元素的优先级从高到低的顺序。优先级队列可以用来解决许多实际问题,如任务调度、资源分配等。 本章主要介绍了...

Global site tag (gtag.js) - Google Analytics