牛客网:AB18 【模板】堆

该博客介绍了一个使用Java实现大顶堆的数据结构。堆的实现包括push、top和pop操作,其中push用于插入元素,top返回最大值但不删除,pop则删除并返回最大值。代码中包含一个调整堆的私有方法adjustHeap,用于保持堆的性质。
摘要由CSDN通过智能技术生成


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;
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值