优先级队列 c语言,队列优先级

优先级队列比队列更专业的数据结构。像普通队列,优先级队列中有相同的方法,但在使用上是有比较大的区别的。在优先级队列数据项都受到键值排序,以便与最低键的值,数据项在前方,键的最高值的数据项在后方,反之亦然。因此,我们根据它的键值分配的优先项。数值越低,优先级越高。以下是优先级队列的主要方法。

基本操作

插入/入队 − 增加数据项到队列的后部。

删除/出队 − 从队列的前面删除一个数据项。

优先级队列表示

3f3d17c225624ccb8e9f83c86626eb3c.png

我们将在本文中使用数组来实现队列。还有一些通过队列支持更多的操作如下。

Peek − 获得在队列前面的元素。

isFull − 检查队列是否已满。

isEmpty − 检查队列是否为空。

插入/入队操作

每当一个元素被插入队列时,优先级队列根据其顺序插入对应的数据项。在这里,我们假设高值的数据具有低优先级。

846bce62549ae7b48c9100bcf8400d36.png

void insert(int data){

int i = 0;

if(!isFull()){

// if queue is empty, insert the data

if(itemCount == 0){

intArray[itemCount++] = data;

}else{

// start from the right end of the queue

for(i = itemCount - 1; i >= 0; i-- ){

// if data is larger, shift existing item to right end

if(data > intArray[i]){

intArray[i+1] = intArray[i];

}else{

break;

}

}

// insert the data

intArray[i+1] = data;

itemCount++;

}

}

}

删除/解列操作

每当一个元素是从队列中删除,队列使用项目计数得到元素。一旦元素被移除,项目计数减一。

5bb70c9e1f9ffc5680c298f7512233db.png

int removeData(){

return intArray[--itemCount];

}

演示程序

PriorityQueueDemo.c

#include

#include

#include

#include

#define MAX 6

int intArray[MAX];

int itemCount = 0;

int peek(){

return intArray[itemCount - 1];

}

bool isEmpty(){

return itemCount == 0;

}

bool isFull(){

return itemCount == MAX;

}

int size(){

return itemCount;

}

void insert(int data){

int i = 0;

if(!isFull()){

// if queue is empty, insert the data

if(itemCount == 0){

intArray[itemCount++] = data;

}else{

// start from the right end of the queue

for(i = itemCount - 1; i >= 0; i-- ){

// if data is larger, shift existing item to right end

if(data > intArray[i]){

intArray[i+1] = intArray[i];

}else{

break;

}

}

// insert the data

intArray[i+1] = data;

itemCount++;

}

}

}

int removeData(){

return intArray[--itemCount];

}

int main() {

/* insert 5 items */

insert(3);

insert(5);

insert(9);

insert(1);

insert(12);

// ------------------

// index : 0 1 2 3 4

// ------------------

// queue : 12 9 5 3 1

insert(15);

// ---------------------

// index : 0 1 2 3 4 5

// ---------------------

// queue : 15 12 9 5 3 1

if(isFull()){

printf("Queue is full!\n");

}

// remove one item

int num = removeData();

printf("Element removed: %d\n",num);

// ---------------------

// index : 0 1 2 3 4

// ---------------------

// queue : 15 12 9 5 3

// insert more items

insert(16);

// ----------------------

// index : 0 1 2 3 4 5

// ----------------------

// queue : 16 15 12 9 5 3

// As queue is full, elements will not be inserted.

insert(17);

insert(18);

// ----------------------

// index : 0 1 2 3 4 5

// ----------------------

// queue : 16 15 12 9 5 3

printf("Element at front: %d\n",peek());

printf("----------------------\n");

printf("index : 5 4 3 2 1 0\n");

printf("----------------------\n");

printf("Queue: ");

while(!isEmpty()){

int n = removeData();

printf("%d ",n);

}

}

如果我们编译并运行上述程序,那么这将产生以下结果 -

Queue is full!

Element removed: 1

Element at front: 3

----------------------

index : 5 4 3 2 1 0

----------------------

Queue: 3 5 9 12 15 16

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值