2.4.1

question:

Suppose that the sequence P R I O * R * * I * T * Y * * * Q U E * * * U * E (where a letter means insert and an asterisk means remove the maximum) is applied to an initially empty priority queue. Give the sequence of letters returned by the remove the maximum operations.

answer:

import edu.princeton.cs.algs4.*;

public class MaxPQ<Key extends Comparable<Key>>
{
    private Key[] pq;
    private int N = 0;
    
    public MaxPQ(int maxN)
    {
        pq = (Key[]) new Comparable[maxN + 1];
    }
    
    public boolean isEmpty()
    {
        return N == 0;
    }
    
    public int size()
    {
        return N;
    }
    
    public void insert(Key v)
    {
        pq[++N] = v;
        swim(N);
    }
    
    public Key delMax()
    {
        Key max = pq[1];
        exch(1,N--);
        pq[N+1] = null;
        sink(1);
        return max;
    }
    
    private boolean less(int i, int j)
    {
        return pq[i].compareTo(pq[j]) < 0;
    }
    
    private void exch(int i, int j)
    {
        Key t = pq[i];
        pq[i] = pq[j];
        pq[j] = t;
    }
    
    private void swim(int k)
    {
        while(k > 1 && less(k/2,k))
        {
            exch(k/2,k);
            k/=2;
        }
    }
    
    private void sink(int k)
    {
        while(2*k <= N)
        {
            int j = 2*k;
            if(j < N && less(j,j+1)) j++;
            if(!less(k,j)) break;
            exch(k,j);
            k = j;
        }
    }
    
    public static void main(String[] args)
    {
        int N = 20;
        MaxPQ<String> pq = new MaxPQ<String>(N);
        String[] a = {"P","R","I","O","*","R","*","*","I","*","T","*","Y","*","*","*","Q","U","E","*","*","*","U","*","E"};
        for(int i = 0; i < a.length; i++)
        {
            if(a[i] == "*")
            {
                if(!pq.isEmpty())
                {
                    StdOut.print(pq.delMax() + " ");      
                }
            }
            else
                pq.insert(a[i]);
        }
        StdOut.println();
    }
}

猜你喜欢

转载自www.cnblogs.com/w-j-c/p/9135403.html