Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4208865
  • 博文数量: 176
  • 博客积分: 10059
  • 博客等级: 上将
  • 技术积分: 4681
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-24 12:27
文章分类

全部博文(176)

文章存档

2012年(1)

2011年(4)

2010年(14)

2009年(71)

2008年(103)

分类: Java

2008-04-13 01:25:03

优先级队列定义:
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类为队列中的元素类,当然可以是任何其他类型的类或基本数据类型。
阅读(1900) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~