gpt4 book ai didi

c# - C#中的优先级队列实现

转载 作者:行者123 更新时间:2023-11-30 16:24:40 29 4
gpt4 key购买 nike

<分区>

我正在尝试使用 SortedDictionary 实现优先级队列机制,我想获得有关我当前实现的建议。

我的实现如下:

public class PriorityQueue
{
private Object lockObj;
private SortedDictionary<PQMsgPriority, Queue<PQMessage>> messageDictionary;

public PriorityQueue()
{
lockObj = new object();
messageDictionary = new SortedDictionary<PQMsgPriority, Queue<PQMessage>>();
}

public void Enqueue(PQMessage item)
{
lock (lockObj)
{
if(item != null && item.MsgPriority == PQMsgPriority.None)
{
if (messageDictionary.ContainsKey(item.MsgPriority))
{
Queue<PQMessage> dataList = messageDictionary[item.MsgPriority];
dataList.Enqueue(item);
messageDictionary[item.MsgPriority] = dataList;
}
else
{
Queue<PQMessage> dataList = new Queue<PQMessage>();
dataList.Enqueue(item);
messageDictionary.Add(item.MsgPriority, dataList);
}
}
}
}

public PQMessage Dequeue()
{
lock (lockObj)
{
PQMessage messageData = null;
PQMsgPriority deleteKey = PQMsgPriority.None;

//If no data available, throw an exception
if (messageDictionary.Count == 0)
throw new InvalidOperationException();

foreach (KeyValuePair<PQMsgPriority, Queue<PQMessage>> item in messageDictionary)
{
Queue<PQMessage> dataList = item.Value;
messageData = dataList.Dequeue();
messageDictionary[item.Key] = dataList;

//If there is no more elements remaining in the list, set a flag (deleteKey) for deleting the key
if (dataList.Count == 0)
deleteKey = item.Key;

break;
}

//If the deleteKey flag is set, delete the key from the dictionary
if (deleteKey != PQMsgPriority.None)
messageDictionary.Remove(deleteKey);

return messageData;
}
}

public int Count()
{
lock (lockObj)
{
return messageDictionary.Count;
}
}

public PQMessage Peek()
{
lock (lockObj)
{
PQMessage messageData = null;

//If no data available, throw an exception
if (messageDictionary.Count == 0)
throw new InvalidOperationException();

foreach (KeyValuePair<PQMsgPriority, Queue<PQMessage>> item in messageDictionary)
{
Queue<PQMessage> dataList = item.Value;
messageData = dataList.Peek();
break;
}

return messageData;
}
}
}

public enum PQMsgPriority
{
High = 0,
Medium = 1,
Low = 2,
None = 3
}

public class PQMessage
{
private PQMsgPriority msgPriority;
private Object message;

#region Properties
public PQMsgPriority MsgPriority
{
get { return msgPriority; }
set { msgPriority = value; }
}
public Object Message
{
get { return message; }
set { message = value; }
}
#endregion

public PQMessage(PQMsgPriority msgPriority, Object message)
{
this.msgPriority = msgPriority;
this.message = message;
}
}

如果还有其他实现优先级队列的方法,请务必指出正确的方向。

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com