创建.net优先队列

原创 2007年09月21日 11:22:00

有时可能需要一种操作与Queue类似的数据结构,但要根据一种特定的顺序返回对象。向这个队列增加对象时,要根据其优先级放入队列的适当位置。在从队列获取对象时,队列可以根据优先级返回最高或最低的元素。

范型优先队列类:

public class PriorityQueue<T> : IEnumerable, ICloneable
        
...{
            
public PriorityQueue() ...{}
            
//指定自定义的比较接口
            public PriorityQueue(IComparer<T> icomparer)
            
...{
                specialComparer 
= icomparer;
            }



            
protected List<T> internalQueue = new List<T>();
            
protected IComparer<T> specialComparer = null;


            
public int Count
            
...{
                
get ...{return (internalQueue.Count);}
            }


            
public void Clear()
            
...{
                internalQueue.Clear();
            }


            
public object Clone()
            
...{
                
// Make a new PQ and give it the same comparer
                PriorityQueue<T> newPQ = new PriorityQueue<T>(specialComparer);
                newPQ.CopyTo(internalQueue.ToArray(),
0);
                
return newPQ;    
            }


            
public int IndexOf(T item)
            
...{
                
return (internalQueue.IndexOf(item));
            }


            
public bool Contains(T item)
            
...{
                
return (internalQueue.Contains(item));
            }


            
public int BinarySearch(T item)
            
...{
                
return (internalQueue.BinarySearch(item, specialComparer));
            }


            
public bool Contains(T item, IComparer<T> specialComparer)
            
...{
                
if (internalQueue.BinarySearch(item, specialComparer) >= 0)
                
...{
                    
return (true);
                }

                
else
                
...{
                    
return (false);
                }

            }


            
public void CopyTo(T[] array, int index)
            
...{
                internalQueue.CopyTo(array, index);
            }


            
public virtual T[] ToArray()
            
...{
                
return (internalQueue.ToArray());
            }


            
public virtual void TrimExcess()
            
...{
                internalQueue.TrimExcess();
            }


            
public void Enqueue(T item)
            
...{
                internalQueue.Add(item);
                internalQueue.Sort(specialComparer);
            }


            
public T DequeueSmallest()
            
...{
                T item 
= internalQueue[0];
                internalQueue.RemoveAt(
0);

                
return (item);
            }


            
public T DequeueLargest()
            
...{
                T item 
= internalQueue[internalQueue.Count - 1];
                internalQueue.RemoveAt(internalQueue.Count 
- 1);

                
return (item);
            }


            
public T PeekSmallest()
            
...{
                
return (internalQueue[0]);
            }


            
public T PeekLargest()
            
...{
                
return (internalQueue[internalQueue.Count - 1]);
            }


            
public IEnumerator GetEnumerator()
            
...{
                
return (internalQueue.GetEnumerator());
            }

        }

 实现了比较接口的字符串比较程序:

public class CompareStrLen<T> : IComparer<T>
            
where T: IComparable<T>
        
...{
            
public int Compare(T obj1, T obj2)
            
...{
                
int result = 0;
                
if ((obj1 is string&& (obj2 is string))
                
...{
                    result 
= CompareStrings(obj1 as string, obj2 as string);
                }

                
else
                
...{
                    
// Default to the objects comparison algorithm
                    result = Compare(obj1, obj2);
                }

                
return (result);
            }


            
private int CompareStrings(string str1, string str2)
            
...{
                
if (str1.Length == str2.Length)
                
...{
                    
return (0);
                }

                
else if (str1.Length > str2.Length)
                
...{
                    
return (1);
                }

                
else
                
...{
                    
return (-1);
                }

            }


            
public bool Equals(T item1, T item2)
            
...{
                
return (item1.Equals(item2));
            }


            
public int GetHashCode(T obj)
            
...{
                
return (obj.GetHashCode());
            }

        }

测试程序:

public static void CreatePriorityQueue()
        
...{
            
// Create List of messages
            List<string> msgs = new List<string>();
            msgs.Add(
"foo");
            msgs.Add(
"This is a longer message.");
            msgs.Add(
"bar");
            msgs.Add(
@"Message with odd characters
                   !@#$%^&*()_+=-0987654321~|}{[]/;:?/>.<,
");
            msgs.Add(
@"<                                                                   
                      >
");
            msgs.Add(
"<text>one</text><text>two</text><text>three</text>" + 
                
"<text>four</text>");
            msgs.Add(
"");
            msgs.Add(
"1234567890");

            
// Create a Priority Queue with the appropriate comparer
            CompareStrLen<string> comparer = new CompareStrLen<string>();
            PriorityQueue
<string> pqueue = new PriorityQueue<string>(comparer);

            
// Add all messages from the List to the priority queue
            foreach (string msg in msgs)
            
...{
                pqueue.Enqueue(msg);
            }


            
// Display messages in the queue in order of priority
            foreach (string msg in pqueue)
            
...{
                Console.WriteLine(
"Msg: " + msg);
            }


            Console.WriteLine(
"pqueue.Count == " + pqueue.Count);
            
//pqueue.Clear();
            
//Console.WriteLine("pqueue.Count == " + pqueue.Count);

            Console.WriteLine(
"pqueue.IndexOf('bar') == " + pqueue.IndexOf("bar"));
            Console.WriteLine(
"pqueue.IndexOf('_bar_') == " + pqueue.IndexOf("_bar_"));

            Console.WriteLine(
"pqueue.Contains('bar') == " + pqueue.Contains("bar"));
            Console.WriteLine(
"pqueue.Contains('_bar_') == " + pqueue.Contains("_bar_"));

            Console.WriteLine(
"pqueue.BinarySearch('bar') == " + pqueue.BinarySearch("bar"));
            Console.WriteLine(
"pqueue.BinarySearch('_bar_') == " + pqueue.BinarySearch("_bar_"));
            
            
// Dequeue messages starting with the smallest
            int currCount = pqueue.Count;
            
for (int index = 0; index < currCount; index++)
            
...{
                
// In order to dequeue messages starting with the largest uncomment 
                
//   the following line and comment the following lines that 
                
//   dequeue starting with the smallest message
                
//Console.WriteLine("pqueue.DequeueLargest(): " + 
                
//                  pqueue.DequeueLargest().ToString());

                Console.WriteLine(
"pqueue.DequeueSmallest(): " + 
                    pqueue.DequeueSmallest().ToString());
            }

        
        }

ActiveMQ之队列特性

介绍队列经常会用到的一些特性,如:通配符、独占消费、组合队列等
  • tianwei7518
  • tianwei7518
  • 2015年06月01日 11:33
  • 2462

Swift3 GCD全局队列(global)的优先级

Swift 3 在GCD的语法上改变了很多,更加贴近了swift的语法,而且关于队列的优先级也改变了不少。 原先的GCD只有四个优先级,high,default,low,background 然而现在...
  • youshaoduo
  • youshaoduo
  • 2016年11月15日 11:54
  • 6408

rabbitmq结合spring实现消息队列优先级

1.1项目背景:做一个灾情预警的消息平台,灾情检查系统需要向消息平台里面推送消息,这里是典型的异构系统的消息传递,我们需要选择一个中间件作为消息队列,调研分析了 rabbitmq,zeromq,act...
  • qq_33994587
  • qq_33994587
  • 2016年09月28日 12:52
  • 4984

c#优先队列

  • 2017年12月26日 16:09
  • 3KB
  • 下载

优先队列操作

  • 2013年04月12日 15:59
  • 3KB
  • 下载

关于STL中优先队列的用法

  • 2010年01月02日 12:20
  • 2KB
  • 下载

数据结构基于链表实现的优先队列

  • 2011年06月26日 19:33
  • 6KB
  • 下载

C-优先队列

  • 2016年12月08日 21:08
  • 5KB
  • 下载

小大根交替堆实现双端优先队列

  • 2017年10月28日 15:40
  • 8KB
  • 下载

字典树KMP优先队列

  • 2015年03月17日 21:46
  • 1.03MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:创建.net优先队列
举报原因:
原因补充:

(最多只允许输入30个字)