以下是Java实现最大堆、最小堆并封装为优先队列类的完整代码:
import java.util.Arrays;
import java.util.Comparator;
public class PriorityQueue
private static final int DEFAULT_CAPACITY = 11;
private Object[] heap;
private int size;
private final Comparator super T> comparator;
// 最小堆构造
public PriorityQueue() {
this(DEFAULT_CAPACITY, null);
}
// 自定义比较器构造
public PriorityQueue(Comparator super T> comparator) {
this(DEFAULT_CAPACITY, comparator);
}
public PriorityQueue(int initialCapacity, Comparator super T> comparator) {
this.heap = new Object[initialCapacity];
this.comparator = comparator;
}
// 插入元素
public void offer(T item) {
if (item == null) throw new NullPointerException();
if (size >= heap.length) grow();
heap[size] = item;
siftUp(size);
size++;
}
// 获取堆顶元素
@SuppressWarnings("unchecked")
public T peek() {
return (size == 0) ? null : (T) heap[0];
}
// 移除堆顶元素
@SuppressWarnings("unchecked")
public T poll() {
if (size == 0) return null;
T result = (T) heap[0];
heap[0] = heap[--size];
heap[size] = null;
if (size > 0) siftDown(0);
return result;
}
public int size() { return size; }
public boolean isEmpty() { return size == 0; }
private void grow() {
int newCapacity = heap.length + (heap.length < 64 ? heap.length : heap.length >> 1);
heap = Arrays.copyOf(heap, newCapacity);
}
@SuppressWarnings("unchecked")
private void siftUp(int k) {
while (k > 0) {
int parent = (k - 1) >>> 1;
if (compare((T) heap[k], (T) heap[parent]) >= 0) break;
swap(k, parent);
k = parent;
}
}
@SuppressWarnings("unchecked")
private void siftDown(int k) {
int half = size >>> 1;
while (k < half) {
int child = (k << 1) + 1;
int right = child + 1;
if (right < size && compare((T) heap[child], (T) heap[right]) > 0)
child = right;
if (compare((T) heap[k], (T) heap[child]) <= 0) break;
swap(k, child);
k = child;
}
}
@SuppressWarnings("unchecked")
private int compare(T a, T b) {
return comparator == null ? ((Comparable super T>) a).compareTo(b) : comparator.compare(a, b);
}
private void swap(int i, int j) {
Object temp = heap[i];
heap[i] = heap[j];
heap[j] = temp;
}
}
class HeapDemo {
public static void main(String[] args) {
// 最小堆
PriorityQueue
minHeap.offer(5);
minHeap.offer(2);
minHeap.offer(8);
System.out.println("Min Heap: " + minHeap.poll()); // 2
// 最大堆
PriorityQueue
maxHeap.offer(5);
maxHeap.offer(2);
maxHeap.offer(8);
System.out.println("Max Heap: " + maxHeap.poll()); // 8
}
}
该实现包含动态扩容、泛型支持和自定义比较器功能,通过调整比较逻辑可轻松切换最大/最小堆模式。PriorityQueue类提供标准队列操作接口,内部使用数组实现堆结构。
http://bbs.zgjzs.org
http://news.zgjzs.org
http://blog.zgjzs.org
http://mall.zgjzs.org
http://shop.zgjzs.org
http://vip.zgjzs.org
http://m.zgjzs.org
http://wap.zgjzs.org
http://app.zgjzs.org
http://down.zgjzs.org
http://data.zgjzs.org
http://pic.zgjzs.org
http://img.zgjzs.org
http://video.zgjzs.org
http://music.zgjzs.org
http://game.zgjzs.org
http://edu.zgjzs.org
http://job.zgjzs.org
http://house.zgjzs.org
http://car.zgjzs.org
http://travel.zgjzs.org
http://food.zgjzs.org
http://health.zgjzs.org
http://tech.zgjzs.org
http://finance.zgjzs.org
http://stock.zgjzs.org
http://fund.zgjzs.org
http://lottery.zgjzs.org
http://sports.zgjzs.org
http://live.zgjzs.org
http://tv.zgjzs.org
http://movie.zgjzs.org
http://book.zgjzs.org
http://art.zgjzs.org
http://baby.zgjzs.org
http://pet.zgjzs.org
http://fashion.zgjzs.org
http://beauty.zgjzs.org
http://love.zgjzs.org
http://wedding.zgjzs.org
http://home.zgjzs.org
http://ren.zgjzs.org
http://ask.zgjzs.org
http://search.zgjzs.org
http://map.zgjzs.org
http://mail.zgjzs.org
http://cloud.zgjzs.org
http://pay.zgjzs.org
http://bank.zgjzs.org
http://gov.zgjzs.org
http://service.shangpin.org
http://member.shangpin.org
http://help.shangpin.org
http://info.shangpin.org
http://support.shangpin.org
http://account.shangpin.org
http://login.shangpin.org
http://register.shangpin.org
http://api.shangpin.org
http://static.shangpin.org
http://cdn.shangpin.org
http://image.shangpin.org
http://photo.shangpin.org
http://upload.shangpin.org
http://download.shangpin.org
http://file.shangpin.org
http://doc.shangpin.org
http://office.shangpin.org
http://work.shangpin.org
http://team.shangpin.org
http://group.shangpin.org
http://project.shangpin.org
http://task.shangpin.org
http://event.shangpin.org
http://calendar.shangpin.org
http://schedule.shangpin.org
http://meeting.shangpin.org
http://chat.shangpin.org
http://message.shangpin.org
http://forum.shangpin.org
http://community.shangpin.org
http://club.shangpin.org
http://activity.shangpin.org
http://market.shangpin.org
http://trade.shangpin.org
http://business.shangpin.org
http://company.shangpin.org
http://enterprise.shangpin.org
http://industry.shangpin.org
http://product.shangpin.org
http://goods.shangpin.org
http://item.shangpin.org
http://brand.shangpin.org
http://category.shangpin.org
http://order.shangpin.org
http://cart.shangpin.org
http://buy.shangpin.org
http://sell.shangpin.org
http://auction.shangpin.org
http://bid.shangpin.org
http://admin.snjrw.org
http://manage.snjrw.org
http://system.snjrw.org
http://portal.snjrw.org
http://center.snjrw.org
http://platform.snjrw.org
http://dashboard.snjrw.org
http://console.snjrw.org
http://control.snjrw.org
http://monitor.snjrw.org
http://report.snjrw.org
http://analysis.snjrw.org
http://statistics.snjrw.org
http://bigdata.snjrw.org
http://ai.snjrw.org
http://robot.snjrw.org
http://smart.snjrw.org
http://iot.snjrw.org
http://vr.snjrw.org
http://ar.snjrw.org
http://blockchain.snjrw.org
http://crypto.snjrw.org
http://nft.snjrw.org
http://meta.snjrw.org
http://web3.snjrw.org
http://dao.snjrw.org
http://defi.snjrw.org
http://mining.snjrw.org
http://wallet.snjrw.org
http://exchange.snjrw.org
http://token.snjrw.org
http://coin.snjrw.org
http://digital.snjrw.org
http://virtual.snjrw.org
http://cyber.snjrw.org
http://security.snjrw.org
http://safe.snjrw.org
http://protect.snjrw.org
http://firewall.snjrw.org
http://antivirus.snjrw.org
http://privacy.snjrw.org
http://encrypt.snjrw.org
http://decode.snjrw.org
http://hack.snjrw.org
http://bug.snjrw.org
http://patch.snjrw.org
http://update.snjrw.org
http://upgrade.snjrw.org
http://fix.snjrw.org
http://debug.snjrw.org