using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QueueTest
{
public struct pqItem {
public int priority;
public string name;
}
/// <summary>
/// 源自Queue的优先队列
/// </summary>
class PQueue:Queue
{
public PQueue() {
}
/// <summary>
/// 重写出队
/// </summary>
/// <returns></returns>
public override object Dequeue()
{
object[] items;//数组
int min;//数字越小优先级越大
items = this.ToArray();//队列元素复制到数组
min = ((pqItem)items[0]).priority;//默认数组索引为0的优先级最大
//
for (int i = 0; i <= items.GetUpperBound(0); i++)
if (((pqItem)items[i]).priority<min)
{
min = ((pqItem)items[i]).priority;//优先级重新设置
}
this.Clear();//从队列中移除所有对象
int x2;
//对数组循环遍历
for (x2 = 0; x2 < items.GetUpperBound(0); x2++)
//如果数组中找到优先级最高的(且名字不为空) 就进队
if (((pqItem)items[x2]).priority ==min&&((pqItem)items[x2]).name!="")
this.Enqueue(items[x2]); //进队
Console.WriteLine(this.Count); //值为1
return base.Dequeue();//先进先出
}
static void Main() {
PQueue erwait = new PQueue();//创建一个队列
pqItem[] erPatient = new pqItem[3];//创建pqItem的数组
pqItem nextPatient;//下一个
erPatient[0].name = "Joe Smith";
erPatient[0].priority = 1;
erPatient[1].name = "Mary Smith";
erPatient[1].priority = 0;
erPatient[2].name = "Sam Smith";
erPatient[2].priority = 3;
for (int i = 0; i <= erPatient.GetUpperBound(0); i++)
{
erwait.Enqueue(erPatient[i]);
}
Console.WriteLine(erwait.Count);//值为3
nextPatient =(pqItem)erwait.Dequeue();
Console.WriteLine(erwait.Count);//值为0
Console.WriteLine(nextPatient.name);
Console.Read();
}
}
}
005_源自Queue的优先队列
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 原文地址:Objective-C封装std::priority_queue<>实现优先队列最近项目中需要用到优先队...
- 一、队列的定义 队列也是数据结构的其中一种,和栈相反的是。队列是只允许在一端进行插入,在另一端进行删除的线性表。 ...
- 首先感谢行走的少年郎写的一篇文章《iOS多线程--彻底学会多线程之『GCD』》它让我对GCD的许多概念有了清晰的理...
- 解决方案 下面的类利用 heapq 模块实现了一个简单的优先级队列: 下面使用 仔细观察可以发现,第一个 pop(...