C++ 实现优先队列的简单实例

 更新时间:2017年08月28日 15:53:27   投稿:lqh  
这篇文章主要介绍了C++ 实现优先队列的简单实例的相关资料,希望通过本文能帮助大家实现优先队列,需要的朋友可以参考下

C++ 实现优先队列的简单实例

优先队列类模版实现:

BuildMaxHeap.h头文件:

#include<iostream> 
using namespace std; 
#define Left(i) i*2+1 
#define Right(i) i*2+2 
#define Parent(i) (i-1)/2 
void Max_Heapify(int a[],int length,int i) 
{ 
  int left,right; 
  left=Left(i); 
  right=Right(i); 
  int num=i; 
  if(left<length&&a[left]>a[i]) 
  { 
    num=left; 
  } 
  //此处逻辑判断出错,开始为else if,发现不能正确排序,改为else之后正确 
  if(right<length&&a[right]>a[num]) 
  { 
    num=right; 
  } 
  if(num!=i) 
  { 
    int temp; 
    temp=a[i]; 
    a[i]=a[num]; 
    a[num]=temp; 
    Max_Heapify(a,length,num); 
  } 
} 
//此处添加利用循环方式代替递归Max_Heapify的函数,该函数可以替代Max_Heapify 
//在某些情况下能取得更好 的效果 
void Max_Heapify1(int a[],int length,int i) 
{ 
  int left,right,num=i,largest=i; 
  left=Left(i); 
  right=Right(i); 
  while(1) 
  { 
    if(a[left]>a[num]&&left<length) 
    { 
      largest=left; 
    } 
    //此处逻辑判断出错,开始为else if,发现不能正确排序,改为else之后正确 
    if(a[right]>a[largest]&&right<length) 
    { 
      largest=right; 
    } 
    if(num!=largest) 
    { 
      int temp; 
      temp=a[num]; 
      a[num]=a[largest]; 
      a[largest]=temp; 
      num=largest; 
      left=Left(num); 
      right=Right(num); 
    } 
    else  
    { 
      break; 
    } 
  } 
   
} 
void Build_Max_Heap(int a[],int length ) 
{ 
  int i; 
  for(i=(length-1)/2;i>=0;i--) 
  { 
    Max_Heapify1(a,length,i); 
  } 
} 
 
void Heap_Sort(int a[],int length) 
{ 
  Build_Max_Heap(a,length); 
  int i; 
  int temp; 
  for(i=length-1;i>=1;i--) 
  { 
    temp=a[i]; 
    a[i]=a[0]; 
    a[0]=temp; 
    length-=1; 
    Max_Heapify1(a,length,0); 
  } 
} 

PriorQUeue.h

#include<iostream> 
#include "BuileMaxHeap.h" 
using namespace std; 
#define MAX 100 
template <typename type>class PriorQueue 
{ 
private: 
  int length; 
  type a[MAX]; 
public: 
PriorQueue () 
{ 
  int i; 
  length=0; 
   
  for(i=0;i<MAX;i++) 
  { 
    a[i]=0; 
  } 
} 
  ~PriorQueue() 
  { 
     
  } 
  void BuildMaxHeapQueue(); 
  void Init(type b[],int len); 
  type Maxnum(); 
  bool DeleteMax(); 
  void IncreaseKey(int i,type key); 
  void Insert(type key); 
  void Print(); 
  void Sort(); 
}; 
template<typename type>void PriorQueue<type>::Init(type b[],int len) 
{ 
  int i; 
  this->length=len; 
  if(len<=0) 
  { 
    cout<<"Init failed !"<<endl; 
  } 
  for(i=0;i<len;i++) 
  { 
    a[i]=b[i]; 
  } 
  BuildMaxHeapQueue(); 
} 
template<typename type>void PriorQueue<type>::BuildMaxHeapQueue() 
{ 
  Build_Max_Heap(a,length); 
} 
template<typename type>type PriorQueue<type>::Maxnum() 
{ 
  if(length<=0) 
  { 
    cout<<"the queue is empty!"<<endl; 
    return -1; 
  } 
  return a[0]; 
} 
template<typename type>bool PriorQueue<type>::DeleteMax() 
{ 
  if(length<=0) 
  { 
    cout<<"the queue is empty!"<<endl; 
    return 0; 
  } 
  a[0]=a[length-1]; 
  length-=1; 
  Max_Heapify1(a,length,0); 
  return 1; 
} 
template<typename type>void PriorQueue<type>::IncreaseKey(int i,type key) 
{ 
  int num=i; 
  if(key<a[num]) 
  { 
    cout<<"key is error!"<<endl; 
    return ; 
  } 
  a[num]=key; 
  while(num>0&&a[Parent(num)]<a[num]) 
  { 
    type temp; 
    temp=a[num]; 
    a[num]=a[Parent(num)]; 
    a[Parent(num)]=temp; 
    num=Parent(num); 
  } 
} 
 
template<typename type>void PriorQueue<type>::Insert(type key) 
{ 
  if(length>=MAX) 
  { 
    cout<<"the queue is full can't add more!"<<endl; 
    return ; 
  } 
  length+=1; 
  a[length-1]=key; 
  IncreaseKey(length-1,key); 
} 
template<typename type>void PriorQueue<type>::Print() 
{ 
  int i; 
  for(i=0;i<length;i++) 
  { 
    cout<<a[i]<<" "; 
  } 
  cout<<endl; 
} 
template<typename type>void PriorQueue<type>::Sort() 
{ 
  Heap_Sort(a,length); 
} 
 

main.cpp

#include"PriorQueue.h" 
#include<iostream> 
using namespace std; 
 
int main() 
{ 
  PriorQueue<int> node; 
  int b[10]={4,1,3,2,16,9,10,14,8,7}; 
  node.Init(b,10); 
  int i; 
  node.Print(); 
  cout<<endl; 
  cout<<node.Maxnum()<<endl; 
  node.DeleteMax(); 
  node.Print(); 
  node.Insert(232); 
  node.Sort(); 
  node.Print(); 
  return 0; 
} 

以上就是数据结构优先队列的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • C++中友元的实例详解

    C++中友元的实例详解

    这篇文章主要介绍了C++中友元的实例详解的相关资料,希望通过本文大家能掌握友元的使用方法,需要的朋友可以参考下
    2017-09-09
  • 详解C/C++内存管理

    详解C/C++内存管理

    内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,今天给大家分享C/C++内存管理的实例代码,需要的朋友参考下吧
    2021-06-06
  • 漫画讲解C语言中最近公共祖先的三种类型

    漫画讲解C语言中最近公共祖先的三种类型

    这篇文章主要总结了使用C语言查找最近公共祖先的三种方法类型,用漫画的方式讲解原理定义,看上去更生动形象,帮助你更好的理解透彻,快来跟着本文往下看吧
    2021-11-11
  • C语言 超详细介绍与实现线性表中的无头单向非循环链表

    C语言 超详细介绍与实现线性表中的无头单向非循环链表

    无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多
    2022-03-03
  • NDK 数据结构之队列与栈等的实现

    NDK 数据结构之队列与栈等的实现

    这篇文章主要介绍了NDK 数据结构之队列与栈等的实现的相关资料,希望通过本文大家能理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • C语言超详细讲解栈与队列实现实例

    C语言超详细讲解栈与队列实现实例

    栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解
    2022-03-03
  • C语言循环结构详解

    C语言循环结构详解

    本文主要介绍C语言循环结构的基础知识,这里整理了循环的基础资料并附简单的代码示例详细讲解,有需要的小伙伴可以参考下
    2021-10-10
  • C++中int main(int argc, char** argv)的参数使用

    C++中int main(int argc, char** argv)的参数使用

    int main(int argc, char** argv) 是C和C++程序的入口点,其中argc和argv是用来接收从命令行传递给程序的参数的,本文就来介绍一下这两个参数的含义,感兴趣的可以了解一下的相关资料
    2024-01-01
  • C++ Primer 第一部分基本语言

    C++ Primer 第一部分基本语言

    这篇文章主要介绍了C++ Primer 第一部分基本语言的相关资料,需要的朋友可以参考下
    2014-02-02
  • 一文读懂c++11 Lambda表达式

    一文读懂c++11 Lambda表达式

    这篇文章主要介绍了c++11 Lambda表达式的相关资料,帮助大家更好的理解和学习C++,感兴趣的朋友可以了解下
    2020-08-08

最新评论