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

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

(0)

相关推荐

  • 优先队列(priority_queue)的C语言实现代码

    优先队列(priority_queue)和一般队列(queue)的函数接口一致,不同的是,优先队列每次出列的是整个队列中最小(或者最大)的元素. 本文简要介绍一种基于数组二叉堆实现的优先队列,定义的数据结构和实现的函数接口说明如下: 一.键值对结构体:KeyValue 复制代码 代码如下: // =============KeyValue Struct==================================typedef struct key_value_struct KeyValu

  • PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例

    队列这种数据结构更简单,就像我们生活中排队一样,它的特性是先进先出(FIFO). PHP SPL中SplQueue类就是实现队列操作,和栈一样,它也可以继承双链表(SplDoublyLinkedList)轻松实现. SplQueue类摘要如下: SplQueue简单使用如下: 复制代码 代码如下: $queue = new SplQueue();   /**  * 可见队列和双链表的区别就是IteratorMode改变了而已,栈的IteratorMode只能为:  * (1)SplDoublyL

  • 深入探讨POJ 2312 Battle City 优先队列+BFS

    相信坦克大战大家都玩过吧,本题就是根据这个游戏设计的.坦克要从起点(Y),到目的地(T),坦克不能通过钢墙(S),河(R),可以在空地在行走(E),射击破坏砖墙(B),射击砖墙时不行走且花费一个单位的时间,在空地上行走时也花费一个单位的时间.求坦克从起点到目的地最少花多少时间,不可达输出-1:很好的一道搜索题.因为考虑到通过砖墙时和空地所花的时间不同,所以不能使用一般的BFS广搜来做.用DFS深搜,你会发现时间复杂非常高,必然会超时(最大是300*300的图).本题可以使用改进过的广搜或优先队列

  • JavaScript队列、优先队列与循环队列

    队列是一种遵从先进先出(FIFO)原则的有序集合 队列在尾部添加新元素,从顶部移除元素 队列的理解 队列在我们生活中最常见的场景就是排队了 队列这个名字也已经很通俗易懂了 和栈很像,这不过队列是先入先出的数据结构 队列的前面是队头 队列的后面是队尾 出队从队头出 入队从队尾入 队列的创建 和栈类似,这里我就不就不啰嗦了 同样需要实现一些功能 这里我类比生活中的排队上厕所 向队列中添加元素(进入排队的队伍中) 移除队头元素(队伍最前面的人出队进入厕所) 查看队头元素(查看队伍最前面的人) 判断队列

  • STL priority_queue(优先队列)详解

    构造,析构 priority_queue() //默认构造函数,生成一个空的排序队列 priority_queue(const queue&); //拷贝构造函数 priority_queue(const Compare& comp); //构造生成一个空的priority_queue对象, //使用comp作为priority_queue的comparison priority_queue(const value_type* first, const value_type* last);

  • 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); i

  • 把普通对象转换成json格式的对象的简单实例

    1.什么叫做JSON? JSON只是一种数据格式(它不是一种新的数据类型) var obj = {name: "中国", age: 5000};//->普通格式的对象 var jsonObj = {"name": "中国", "age": 5000};//->JSON格式的对象 (只要把普通对象的属性名用""(不能是'')包起来,这样的格式就是我们JSON格式的对象) var data = [

  • Angularjs中ng-repeat的简单实例

    Angularjs中ng-repeat的简单实例 第一个例子:使用ng-repeat最简单的例子 <html ng-app="myApp"> <head> <title>angularjs-demo</title> <script type="text/javascript" src="angular.min.js" charset="utf-8"></scri

  • Java实现一个小说采集程序的简单实例

    被标题吸引进来的不要骂我. 只是一个简单的实现,随手写了来下载一部喜欢的小说的.示例中的小说只是示例,不是我的菜. 使用了jsoup.挺好用的一个工具. 有需要的话,参考下自己改吧.挺简单的,是吧. 代码如下: package com.zhyea.doggie; import java.io.File; import java.io.FileWriter; import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.n

  • 使用JS实现图片展示瀑布流效果(简单实例)

    不知大家有没有发现,一般的图片展示网站都会使用瀑布流效果,所谓的瀑布流 就是网站内的图片不会一下子全缓存出来,而是等你滚动到一定的距离的时候, 下面的图片才会继续缓存,并且图片也是随机出现的,只是宽度一样,高度并不 一样,高高低低就像瀑布一样,所以叫做瀑布流效果.下面我把代码给大家,大家 随便下几张图片试试. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&qu

  • ASP.NET中Web API的简单实例

    一.Web API的路由 1.在Visual Studio中新建MVC4项目,在App_Start目录下有一个WebApiConfig.cs文件,这个文件中就是相应的Web API的路由配置了. 2.Web API 框架默认是基于 Restful 架构模式的,与ASP.NET MVC 有区别的是,它会根据 Http 请求的 HttpMethod(Get.Post.Put.Delete)来在Controller 中查找 Action,规则是:Action 名中是否以Get.Post 开头?Acti

  • 通过PHP简单实例介绍文件上传

    php文件上传的简单例子,获取文件名称.类型.大小等相关信息,完成文件的上传,供大家学习参考. 1.上传文件的代码: code <?php //判断临时文件存放路径是否包含用户上传的文件 if(is_uploaded_file($_FILES["uploadfile"]["tmp_name"])){ //为了更高效,将信息存放在变量中 $upfile=$_FILES["uploadfile"];//用一个数组类型的字符串存放上传文件的信息

  • JSP 注释的详解及简单实例

     JSP 注释的详解及简单实例 一 三种格式 二 举例 <body> <h1>大家好</h1> <hr> <!-- 我是HTML注释,在客户端可见 --> <%-- 我是JSP注释,在客户端不可见 --%> <% //单行注释 /*多行注释*/ out.println("大家好,欢迎大家学习JAVAEE开发."); %> <br> 你好,<%=s %><br> x+y

  • JSP生成九九乘法表的简单实例

    JSP生成九九乘法表的简单实例 一 用表达式和脚本方式实现九九乘法表 <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://&quo

  • Delphi 用DLL实现插件的简单实例

    Delphi 用DLL实现插件的简单实例 这是DLL的代码 实现代码: library MyDll; uses SysUtils, Dialogs, Classes; procedure ShowInfo(info:PChar);stdcall; begin ShowMessage('您选择了['+info+']'); end; function GetCaption:Pchar; begin Result := '中国'; end; exports ShowInfo, GetCaption;

随机推荐