import java.util.Scanner;
/**
* @author xienl
* @description 堆
* @date 2022/6/8
*/
public class Solution {
public static void main(String[] args) {
final String push = "push", pop = "pop", top = "top";
Scanner scanner = new Scanner(System.in);
// 输入次数
int num = scanner.nextInt();
Head head = new Head(num);
scanner.nextLine(); // 这个是个scanner的大坑,如果按了会车一定要加
for (int i= 0; i < num; i++){
String str = scanner.nextLine();
String[] split = str.split("\\s+");
if ("push".equals(split[0])){
head.push(Integer.parseInt(split[1]));
} else if ("top".equals(split[0])){
head.top();
} else if ("pop".equals(split[0])){
head.pop();
}
}
}
}
/**
* 堆
*/
class Head {
private int[] array; // 存放堆的数组
private int length;
public Head(int n) {
array = new int[n];
length = 0;
}
public void push(int value) {
array[length++] = value;
// 调整堆,没看懂,不过这个是一个公式,是固定的
for (int i = length / 2 - 1; i >= 0; i = (i - 1) / 2) {
adjustHeap(i);
if (i == 0) {
break;
}
}
}
public void top() {
if (length == 0) {
System.out.println("empty");
return;
}
System.out.println(array[0]);
}
public void pop() {
if (length == 0) {
System.out.println("empty");
return;
}
// 获取下一个最大值
System.out.println(array[0]);
array[0] = array[length - 1];
length--;
// 重新调整大顶堆
adjustHeap(0);
}
/**
* 调整堆
*/
private void adjustHeap(int i) {
int temp = array[i];
for (int k = 2 * i + 1; k < length; k = k * 2 + 1) {
// 后一个树大于前一个数
if (k + 1 < length && array[k + 1] > array[k]) {
k++;
}
if (array[k] > temp) {
array[i] = array[k];
i = k;
} else {
break;
}
}
array[i] = temp;
}
}
牛客网:AB18 【模板】堆
最新推荐文章于 2024-07-08 16:47:21 发布
该博客介绍了一个使用Java实现大顶堆的数据结构。堆的实现包括push、top和pop操作,其中push用于插入元素,top返回最大值但不删除,pop则删除并返回最大值。代码中包含一个调整堆的私有方法adjustHeap,用于保持堆的性质。
摘要由CSDN通过智能技术生成