手动实现一个优先级队列,拥有插入、弹出、判空功能。核心代码是对维护堆结构的代码:从完全二叉树逆序第一个有子节点的节点开始调整。
//手动实现一个二叉堆(优先级队列)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class PriorityQueue{
public:
//插入
void push(int n){
arr.push_back(n);
makeHeap();
}
//弹出队首元素
int pop(){
int ans=arr[0];
swap(arr[0],arr[arr.size()-1]);
arr.pop_back();
makeHeap();
return ans;
}
//判断队空
bool empty(){
return arr.size()==0;
}
private:
//底层数组
vector<int>arr;
//调整堆结构
void makeHeap(){
int len=arr.size();
int first=len/2-1; //固定是此位置
for(int i=first;i>=0;i--){
//如果存在右子节点
if(2*i+2<len){
if(arr[2*i+2]<arr[2*i+1] && arr[2*i+2]<arr[i])
swap(arr[2*i+2],arr[i]);
else if(arr[2*i+1]<arr[2*i+2] && arr[2*i+1]<arr[i])
swap(arr[2*i+1],arr[i]);
}
//只有左子节点
else{
if(arr[2*i+1]<arr[i]){
swap(arr[2*i+1],arr[i]);
}
}
}
}
};
int main(){
PriorityQueue que;
que.push(1);
que.push(1);
que.push(4);
que.push(3);
que.push(2);
while(!que.empty()){
cout<<que.pop()<<" ";
}
}