• 智能AI问答!更聪明、更完整、原创作!
  • 一款基于GPT的超级AI机器人,可以回答问题、聊天、创作、写文案!

利用vector实现抽象小顶堆MinHeap类,设计出堆方法DeleteMin(Type E),入堆方法Insert(Type E),并能异常处理OutOfBounds

发布于 2023-10-22 15:27:58

下面是利用vector实现抽象小顶堆MinHeap类的代码:

#include <iostream>
#include <vector>

template<class Type>
class MinHeap {
private:
    std::vector<Type> heap;

public:
    MinHeap() = default;

    void Insert(Type element) {
        heap.push_back(element);  // 将元素插入末尾
        UpAdjust(heap.size() - 1);  // 上浮调整
    }

    void DeleteMin() {
        if (heap.empty()) {
            throw std::out_of_range("Heap is empty.");  // 抛出越界异常
        }
        std::swap(heap[0], heap[heap.size() - 1]);  // 将最后一个元素与根节点交换
        heap.pop_back();  // 删除最后一个元素
        DownAdjust(0);  // 下沉调整
    }

private:
    void UpAdjust(int child) {
        int parent = (child - 1) / 2;
        Type temp = heap[child];
        while (child > 0 && temp < heap[parent]) {
            heap[child] = heap[parent];
            child = parent;
            parent = (child - 1) / 2;
        }
        heap[child] = temp;
    }

    void DownAdjust(int parent) {
        int child = parent * 2 + 1;
        Type temp = heap[parent];
        while (child < heap.size()) {
            if (child + 1 < heap.size() && heap[child] > heap {
                           }
            if (temp <= heap[child]) {
                break;
            }
            heap[parent] = heap[child];
            parent = child;
            child = parent * 2 + 1;
        }
        heap[parent] = temp;
    }
};

int main() {
    MinHeap<int> minHeap;
    try {
        minHeap.DeleteMin();  // 抛出越界异常
    } catch (std::out_of_range& e) {
        std::cout << "Exception caught: " << e.what() << std::endl;
    }

    minHeap.Insert(4);
    minHeap.Insert(8);
    minHeap.Insert(3);
    minHeap.Insert(2);
    minHeap.Insert(1);

    minHeap.DeleteMin();
    minHeap.DeleteMin();

    std::cout << "Heap elements after delete: ";
    while (!minHeap.empty()) {
        std::cout << minHeap.top() << " ";
        minHeap.pop();
    }
    std::cout << std::endl;

    return 0;
}

这里使用模板类MinHeap来实现小顶堆,底层采用vector来存储堆元素。Insert方法用于将元素插入堆中,并通过上浮调整维护堆的性质;DeleteMin方法用于删除堆顶元素,并通过下沉调整维护堆的性质。在DeleteMin方法中,如果堆为空,则抛出std::out_of_range越界异常。

你可以根据需要修改Type的数据类型,并在main函数中进行测试。

0 条评论

发布
问题

在线
客服