1. 程式人生 > >資料機構之優先順序佇列

資料機構之優先順序佇列

package com.zhiru;
/*
 * 優先順序佇列例子
 * 基於陣列實現
 * ----------------------------
 * 編號     1     2    3   4    5
 * 優先權20    0    10  30   15//值小的優先權大
 * 順序    2     3    5   1    4
 */
public class PQueue {

	private int count=0;//佇列元素個數
	private int maxSize=100;//佇列元素最大容量
	private int[]data;
	PQueue(int size){
		maxSize=size;
		data=new int[maxSize];
	}
	public boolean isEmpty(){
		return count==0;
	}
	public boolean isFull(){
		return count==maxSize;
	}
	public int getSize(){
		return count;
	}
	//將元素插入到隊尾
	public void insert(int val){
		if(count<=maxSize){
			data[count++]=val;
			//插入後調整,保證權值大的在後面,即優先權大的在前面。
			adjust();
		} 
		else
			System.out.print("佇列滿了\n");
			
	}
	//在插入一個元素後將佇列進行調整,將優先權大(權值小)的調到隊頭.
	//類似插入排序演算法.
	public void adjust(){
		if(count<=maxSize){
			int temp=data[count-1];
			for(int j=count-2;j>=0;j++){
				if(data[j]<=temp)
					break;
				else
					data[j+1]=data[j];//元素後移.
				data[j+1]=temp;//找到合適的位置插入.
			}
			
		}
	}
	//返回隊頭元素.
	public int getMin(){
		if(count==0) return -1;//表示隊空.
		int x=data[0];
		for(int i=1;i<count;i++) data[i-1]=data[i];//前移刪除隊頭元素.
		count--;//長度減一
		return x;
	}
	public void printPqueue(){
		for(int j=0;j<count;j++){
			System.out.print(data[j]+" ");
		}
		System.out.print("\n");
	}
	public static void main(String[]args){
		PQueue pq=new PQueue(5);//maxSize=;
		int[]x={20,0,10,30,15};
		for(int i=0;i<x.length;i++){
			pq.insert(x[i]);
		}
		pq.printPqueue();
		pq.getMin();
		pq.printPqueue();
		
	}
}
20 0 10 30 15 
0 10 30 15