public struct pqItem
{
public int priority;
public string name;
}
public class PQueue : Queue
{
public PQueue()
: base()
{
}
public override object Dequeue()
{
object[] items;
int min, minindex = 0;
items = this.ToArray();
min = ((pqItem)items[0]).priority;
for (int x = 1; x <= items.GetUpperBound(0); x++)
if (((pqItem)items[x]).priority < min)
{
min = ((pqItem)items[x]).priority;
minindex = x;
}
this.Clear();
for (int x = 0; x <= items.GetUpperBound(0); x++)
if (x != minindex && ((pqItem)items[x]).name != "")
this.Enqueue(items[x]);
return items[minindex];
}
}
下列代码演示了PQueue类的一个简单实用。急诊室的等候室给前来接受治疗的患者指派一个优先级。一个有心脏病征兆的患者要比一个严重割伤的病人更早的接受治疗。下面的程序模拟了3个病人大致在一个时刻进入急诊室的情况。每个病人都被分拣护士来查看并被分配一个优先级然后加入队列。第一个被治疗的病人是由Dequeue方法首先由队列移除的那个。
static void Main()
{
PQueue erwait = new PQueue();
pqItem[] erPatient = new pqItem[4];
pqItem nextPatient;
erPatient[0].name = "Joe Smith";
erPatient[0].priority = 1;
erPatient[1].name = "Mary Brown";
erPatient[1].priority = 0;
erPatient[2].name = "Sam Jones";
erPatient[2].priority = 3;
for (int x = 0; x <= erPatient.GetUpperBound(0); x++)
erwait.Enqueue(erPatient[x]);
nextPatient = (pqItem)erwait.Dequeue();
Console.WriteLine(nextPatient.name);
}
学会有效与恰当的使用数据结构是区分专家程序员与一般程序员的技能之一。专家程序员知道组织一个程序的数据到一个适当的数据结构使操作数据的工作变得简单。事实上,一上来就使用数据抽象的方式来考虑一个计算机编程问题可以很容易的想出一个好的解决问题的方案。
在本章中我们讨论了2种很常见的数据结构:栈和队列。栈用来解决许多不同类型的计算机编程问题,尤其是在系统编程领域如解释器和编译器。我们同样看到如何使用栈解决更普遍的问题,如判断一个单词是否为回文。
队列同样由于许多程序。操作系统使用队列来管理进程(通过优先队列),并且队列同样常用于模拟现实生活中的流程。最后,我们派生自Queue类实现了一个优先队列。由.NET Framework类库中的类派生新类的能力是C#的.NET版本的主要能力之一。