博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

小宝--读书笔记

精修内功!
  zieckey.cublog.cn

关于作者
思路决定出路,态度决定高度!
|| << >> ||
我的分类


数据结构——优先级队列
优先级队列定义:
1. 元素按优先级排队,优先级高者居前,优先级相同的则按严格按到达的顺序先到者居前;
2. 元素出队时居前者先出队;

基本操作:
1. 元素入队
2. 元素出队

这里给出一个用数组实现的Java源码:

package zieckey.datastructure.study.queue;

import zieckey.datastructure.study.graph.*;

/**
 * 有优先级的队列
 *
 * @author zieckey
 */

public class PriorityQueue
{
    // array in sorted order, from max at 0 to min at size-1

    private final int    SIZE    = 20;
    private Edge[]        queArray;
    private int            size;

    public PriorityQueue( )
    {
        queArray = new Edge[SIZE];
        size = 0;
    }

    /**
     * 插入一条边到队列中,同时保证优先级顺序
     * @param item
     */

    public void insert( Edge item ) // insert item in sorted order

    {
        if ( size >= SIZE )
        {
            System.out.println("The queue is full. Please remove some items before inserting new item into it.");
            return;
        }
        
        int j;
        for ( j = 0; j < size; j++ )
        {
            // find place to insert

            if ( item.distance >= queArray[j].distance )
            {
                break;
            }
        }
        for ( int k = size - 1; k >= j; k-- )
        {
            // move items up

            queArray[k + 1] = queArray[k];
        }
        queArray[j] = item; // insert item

        size++ ;
    }
    
    /**
     * 移出一条最小的边,即数组index最大的那个元素,同时,queue的size自减1
     * @return 返回该元素
     */

    public Edge removeMin()
    {
        return queArray[--size];
    }
    
    /**
     * 移出index=n的边,同时,queue的size自减1
     * @param n
     */

    public void removeN( int n ) // remove item at n

    {
        for ( int j = n; j < size - 1; j++ )
        {
            // move items down

            queArray[j] = queArray[j + 1];
        }
        size-- ;
    }
    
    /**
     *
     * @return 返回最小的元素,即数组index最大的那个元素
     */

    public Edge peekMin() // peek at minimum item

    {
        return queArray[size - 1];
    }

    /**
     *
     * @return 返回queue的元素个数
     */

    public int size() // return number of items

    {
        return size;
    }

    /**
     * 判断queue是否为空
     * @return 空,返回true;不空,返回false
     */

    public boolean isEmpty() // true if queue is empty

    {
        return ( size == 0 );
    }

    /**
     *
     * @param n index
     * @return 返回index=n的元素
     */

    public Edge peekN( int n ) // peek at item n

    {
        return queArray[n];
    }

}    


其中的Edge类为队列中的元素类,当然可以是任何其他类型的类或基本数据类型。

发表于: 2008-04-13,修改于: 2008-04-13 01:25,已浏览302次,有评论0条 推荐 投诉


网友评论
 发表评论