首页 > 编程语言 >c++ 实现优先队列

c++ 实现优先队列

时间:2024-06-13 11:34:19浏览次数:25  
标签:优先 return 队列 c++ queue int template data size

优先队列底层是堆,下面给出大根堆代码

Push是在新节点到根节点的路径上寻找合适的插入位置;

Pop是删除根节点之后维护大根堆,顺便为最后一个元素寻找合适的位置;

  1 #include<bits/stdc++.h>
  2 
  3 using namespace std;
  4 
  5 template<class T>
  6 class p_queue {
  7 private:
  8     int cap = 10000010;//开辟的空间大小
  9     int size;//当前数据数量
 10     T* data;
 11 
 12 public:
 13     p_queue();
 14     ~p_queue();
 15 
 16     int Size();
 17     bool Empty();
 18     bool Full();
 19     void Push(T key);//堆插入
 20     void Pop();//删除堆顶
 21     T Top();
 22 };
 23 
 24 template<class T>
 25 p_queue<T>::p_queue() {
 26     data = (T*)malloc((cap+1)*sizeof(T));
 27     if (!data) {
 28         perror("传入数据不合法");
 29         return;
 30     }
 31     size = 0;
 32 }
 33 
 34 template<class T>
 35 p_queue<T>::~p_queue() {
 36     while (!Empty())Pop();
 37 }
 38 
 39 template<class T>
 40 int p_queue<T>::Size() {
 41     return size;
 42 }
 43 
 44 template<class T>
 45 bool p_queue<T>::Empty() {
 46     return size == 0;
 47 }
 48 
 49 template<class T>
 50 bool p_queue<T>::Full() {
 51     return size == cap;
 52 }
 53 
 54 template<class T>
 55 void p_queue<T>::Push(T key) {
 56     if (Empty())return data[++size] = key,void();
 57     int i;
 58     for (i = ++size; i > 1 && data[i / 2] < key; i /= 2) {
 59         data[i] = data[i / 2];
 60     }
 61     data[i] = key;
 62 }
 63 
 64 template<class T>
 65 void p_queue<T>::Pop() {
 66     if (Empty()) {
 67         perror("错误:数组为空");
 68         return;
 69     }
 70     int i;
 71     T now = data[size];
 72     --size;
 73     for (i = 1; i*2 <= size;) {
 74         int che = i * 2;
 75         if (che != size && data[che + 1] > data[che])che++;
 76         if (now < data[che]) { data[i] = data[che], i = che; }
 77         else break;
 78     }
 79     data[i] = now;
 80 }
 81 
 82 template<class T>
 83 T p_queue<T>::Top() {
 84     if (Empty()) {
 85         perror("错误:数组为空")。;
 86         return data[0];
 87     }
 88     else return data[1];
 89 }
 90 
 91 int s[10] = { 2,3,5,1,25,1,3,2,4,10 };
 92 
 93 int main() {
 94     p_queue<int> op;
 95     op.Pop();
 96     for (int i = 0; i < 10; i++)op.Push(s[i]);
 97     //for (int i = 1; i <= 10; i++)cout << op.data[i] << " ";
 98     while (!op.Empty()) {
 99         cout << op.Top() << " ";
100         op.Pop();
101     }
102     return 0;
103 }

 

标签:优先,return,队列,c++,queue,int,template,data,size
From: https://www.cnblogs.com/dzh-ai-lyd/p/18245564

相关文章

  • 代码随想录算法训练营第10天 | 队列和栈基础知识、225用队列实现栈、用栈实现队列
    232用栈实现队列https://leetcode.cn/problems/implement-queue-using-stacks/用栈实现队列代码随想录https://programmercarl.com/0232.用栈实现队列.html#其他语言版本225用队列实现栈https://leetcode.cn/problems/implement-stack-using-queues/description/用队列实现......
  • c++在什么情况下会发生拷贝?
    在C++中,对象拷贝通常会在以下情况下发生:传递参数给函数:当你将对象作为参数传递给函数时,如果参数是按值传递的,那么会发生拷贝。例如:voidfunc(MyClassobj);//obj会被拷贝从函数返回对象:当函数返回一个对象时,如果函数返回的是对象本身而不是引用或指针,会发生拷贝。例......
  • C++中的流
    目录字节流(ByteStreams)字符流(CharacterStreams)主要区别在C++中,字节流和字符流是两种处理输入输出(I/O)的操作方式,它们都属于iostream库的一部分。它们的主要区别在于处理数据的基本单元和适用场景。字节流(ByteStreams)字节流以字节(byte)为基本处理单位,每个字节包含......
  • C/C++ 使用宏时应注意的问题总结
    使用C/C++宏时,为了确保代码的正确性、可读性和可维护性,现总结一些注意事项和最佳实践:1.定义常量使用#define定义常量时,要注意其类型不安全性。虽然它使用方便快捷,但缺乏类型检查可能导致问题。如果需要类型安全的常量,可以考虑使用const或constexpr。2.多重包含防范当宏......
  • 红黑树/红黑树迭代器封装(C++)
        本篇将会较为全面的讲解有关红黑树的特点,插入操作,然后使用代码模拟实现红黑树,同时还会封装出红黑树的迭代器。    在STL库中的set和map都是使用红黑树封装的,在前文中我们讲解了AVL树,对于红黑树和AVL树来说,这两种树都是效率很高的搜索二叉树,但是......
  • AVL树 ---(C++)
        本篇讲全面的讲解AVL树的插入,旋转以及验证AVL树的性能(本篇未实现删除代码)。至于为什么会有AVL树,这是因为简单的二叉搜索树并不能直接的保证搜索的效率,因为当我们在二叉搜索树中插入一段有序的序列的时候,二叉搜索树就会退化为单枝树,这个时候进行搜索的时候,时......
  • c++ 游戏:俄罗斯方块
    ​​​​​​​#include<iostream>#include<string>#include<cstdlib>#include<windows.h>#include<ctime>#include<conio.h>#include<cstdio>usingnamespacestd;classTetris{private:intrank;//游戏难度等级intscore;//得分intid;/......
  • C++ 新特性 | C++ 11 | typename关键字
    文章目录一、typename关键字前言:在C++的模板编程中,typename关键字扮演着至关重要的角色。它主要用于指示编译器将一个特定的标识符解释为类型名称,而不是变量名或其他实体。本文将深入探讨typename的用法,帮助读者更好地理解其在模板编程中的作用。一、typename关......
  • C++基础入门学习记录
    本系列基于黑马程序员|c++课程,记录学习相关视频——黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibiliC++基础入门2.6字符串型作用:用于表示一串字符两种风格bool类型占==1个字节==大小示例:C风格字符串: char变量名[]="字符串值"示例:......
  • C++基础入门学习记录
    本系列基于黑马程序员|c++课程,记录学习相关视频——黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibiliC++基础入门3运算符**作用:**用于执行代码的运算本章我们主要讲解以下几类运算符:运算符类型作用算术运算符用于处理四则运算赋值运算符用于......