Example #1
0
        /// <summary>
        /// Removes and returns the element with highest priority, i.e. lowest key.
        /// </summary>
        public KeyValuePair <long, T> Dequeue()
        {
            if (_root == null)
            {
                throw new InvalidOperationException("priority queue is empty!");
            }

            PQItem cur    = _root;
            PQItem parent = null;

            while (cur.Children[0] != null)
            {
                parent = cur;
                cur    = cur.Children[0];
            }

            if (parent == null)
            {
                _root = cur.Children[1];
            }
            else
            {
                parent.Children[0] = cur.Children[1];
            }

            return(new KeyValuePair <long, T>(cur.Key, cur.Value));
        }
Example #2
0
        private void Enqueue(PQItem item, PQItem root)
        {
            Contract.Requires <ArgumentNullException>(item != null);
            Contract.Requires <ArgumentNullException>(root != null);

            if (item.Key == root.Key)
            {
                root.Value = Resolve(root.Value, item.Value);
            }
            else if (item.Key < root.Key)
            {
                if (root.Children[0] == null)
                {
                    root.Children[0] = item;
                }
                else
                {
                    Enqueue(item, root.Children[0]);
                }
            }
            else
            {
                if (root.Children[1] == null)
                {
                    root.Children[1] = item;
                }
                else
                {
                    Enqueue(item, root.Children[1]);
                }
            }
        }
Example #3
0
        /// <summary>
        /// Inserts element <paramref name="value"/> for specified <paramref name="key"/>. Lower key means higher priority.
        /// </summary>
        /// <param name="key">key for which to insert the value</param>
        /// <param name="value">element to insert</param>
        public void Enqueue(long key, T value)
        {
            PQItem pqi = new PriorityQueue <T> .PQItem(key, value);

            if (_root == null)
            {
                _root = pqi;
            }
            else
            {
                Enqueue(pqi, _root);
            }
        }