挑战程序设计竞赛(算法和数据结构)——10.4优先队列的JAVA实现

Posted 小乖乖的臭坏坏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛(算法和数据结构)——10.4优先队列的JAVA实现相关的知识,希望对你有一定的参考价值。

题目:

讲解:

代码:

import java.util.Scanner;

public class PriorityQueue 
    public static void main(String[] args) 
        int MAX = 1000;
        int H = 0;//堆的长度
        int[] A = new int[MAX+1];

        while (true) 
            Scanner cin_string = new Scanner(System.in);
            String s = cin_string.nextLine();
            String[] string_arr = s.split(" ");//如果不是print那很显然是另有操作,需要分割
//            String s = cin.nextLine();//nextLine()函数获取的是一整行的内容其中也包括了(\\n)也就是换行符,如果循环执行会出现nextLine()方法没有执行直接跳过的情况
            if (string_arr[0].equals("end")) 
                break;
            
            else if (string_arr[0].equals("insert")) 
                int key = Integer.valueOf(string_arr[1]);
                H = insert(A, H, key);
            
            else if (string_arr[0].equals("extract")) 
                H = heapExtractMax(A, H);
            
        

    

    public static int insert(int[] A, int H, int key)//传入插入的值,数组和堆的长度
        H++;
        A[H] = -Integer.MIN_VALUE;
        heapIncreaseKey(A, H, key);
        return H;
    

    public static void heapIncreaseKey(int[] A, int H, int key)
        if(key<A[H])
            System.out.println("Error:新键值小于当前键值");
            return;
        
        A[H] = key;
        while(H>1 && A[keyParent(H)]<A[H])
            int temp = A[H];
            A[H] = A[keyParent(H)];
            A[keyParent(H)] = temp;
            H = keyParent(H);
        
    

    public static int heapExtractMax(int[] A, int H)
        if(H<1)
            System.out.println("Error:堆向下溢出");
        
        int max = A[1];
        A[1] = A[H];
        H--;
        maxHeap(A, 1);
        System.out.println(max);
        return H;
    

    public static void maxHeap(int[] A, int i)
        int l = keyLeft(i);
        int r = keyRight(i);
        int H = A.length-1;
        //A[r]右子节点可能不存在,用r_temp来代替这个值
        int r_temp;
        if(r>H)r_temp = -1;
        elser_temp = A[r];

        int largest;
        //从左子节点、自身、右子节点中选出值最大的节点
        if(l <= H && A[l]>A[i])largest = l;
        elselargest = i;
        if (r <= H && r_temp > A[largest]) largest = r;

        if(largest != i)//i的子节点值更大时
            int temp = A[i];
            A[i] = A[largest];
            A[largest] = temp;
            maxHeap(A, largest);
        
    

    public static int keyParent(int i)return i/2;
    public static int keyLeft(int i)return 2*i;
    public static int keyRight(int i)return 2*i+1;


输入输出:

以上是关于挑战程序设计竞赛(算法和数据结构)——10.4优先队列的JAVA实现的主要内容,如果未能解决你的问题,请参考以下文章

挑战程序设计竞赛(算法和数据结构)——12.3深度优先搜索的JAVA实现

《挑战程序设计竞赛》——BFS

挑战程序设计竞赛(算法和数据结构)——15.5最小生成树(Kruskal算法)的JAVA实现

挑战程序设计竞赛(算法和数据结构)——分割(下)&快速排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——19.2九宫格拼图问题的JAVA实现

挑战程序设计竞赛(算法和数据结构)——7.1归并排序JAVA实现