C/C++ 中优先队列简介
优先队列是一种队列,其中元素根据分配给它们的优先级插入或删除,其中优先级是一个整数值,范围在 0-10 之间,0 表示具有最高优先级的元素,10 表示具有最低优先级的元素。实现优先队列遵循两条规则:
- 具有最高优先级的的数据或元素将在具有最低优先级的的数据或元素之前执行。
- 如果两个元素具有相同的优先级,则它们将按照添加到列表中的顺序执行。
有多种可用于实现优先队列的数据结构,例如堆栈、队列和链表。在本文中,我们将解释队列数据结构。有两种方法可用于实现优先队列:
- 在一个数组中维护多个优先级的队列
实现优先队列的一种方法是为每个优先级维护一个队列。我们可以将这些多个队列存储在一个数组中,每个队列将有两个指针,即前端和后端。在队列中,前端指针用于将元素插入队列,并在插入元素时递增 1;另一个指针是后端,用于从队列中删除或移除元素,并在从队列中移除元素时递减 1。最后,通过这两个指针的位置,我们还可以确定队列中的元素数量。
- 在这种表示形式中,我们需要移动指针以腾出空间来插入新元素,这在时间和空间方面都会使其变得复杂。
- 在一个数组中维护每个优先级的队列
在这种方法中,我们为每个元素创建单独的箭头。每个队列都实现为一个循环数组,并有两个指针变量,即前端和后端。具有给定优先级编号的元素将插入到相应的队列中,同样,如果我们想要从队列中删除一个元素,它必须是来自最高优先级队列的元素。最低优先级整数表示最高优先级(0)。
注意 - 如果每个队列的大小相同,那么我们可以创建一个二维数组,而不是创建多个一维数组。
优先队列中插入操作的算法
insert(queue, data, priority) If(queue->Rear[priority] = MAX-1 AND queue->Front[priority] = 0) OR (queue->Rear[priority] +1 =queue->Front[priority]) Print Overflow End IF queue->Rear[priority - 1] = MAX-1 Set queue->Rear[priority - 1] = 0 Else Set queue->Rear[priority] = queue->Rear[priority - 1] +1 End Set queue->CQueue[priority - 1] [queue->Rear[priority - 1] = data IF queue->Front[priority - 1] = -1 Set queue->Front[priority - 1] = 0 End
优先队列中插入操作的算法
delete(queue) Set flag = 0, priority = 0 While priority <= MAX-1 IF NOT queue->Front[priority] = -1 Set flag = 1 Set value = queue->CQueue[priority][queue->Front[priority]] IF queue->Front[priority] = queue->Rear[priority] Set queue->Front[priority] = queue->Rear[priority] = -1 Else IF queue->Front[priority] = MAX-1 Set queue->Front[priority] = 0 Else Set queue->Front[priority] = queue->Front[priority] + 1 End End Break End Set priority = priority + End If flag = 0 Print underflow Else Return value End
广告