【数据结构】优先级队列的实现

建立PriorityQueue.hpp:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<assert.h>
#include<vector>

template<class T>
struct Less
{
    bool operator() (const T& l, const T& r)
    {
        return l < r;
    }
};

template<class T>
struct Greater
{
    bool operator() (const T& l, const T& r)
    {
        return l>r;
    }
};

template<class T,template<class> class Compare=Less>
class Heap
{
public:
    Heap()
        :_a(NULL)
    {}

    Heap(const T* a,size_t size)
    {
        for (int i = 0; i < size; i++)
        {
            _a.push_back(a[i]);
        }
        for (int i = (size - 2) / 2; i >= 0; i--)
        {
            _adjustDown(i);
        }
    }

    void _adjustDown(size_t parent)
    {
        Compare<T> com;
        size_t child = 2 * parent + 1;
        size_t size = _a.size();
        while (child<size)
        {
            if (child + 1<size && com(_a[child + 1],_a[child]))
            {
                ++child;
            }
            if (com(_a[child],_a[parent]))
            {
                swap(_a[child], _a[parent]);
                parent = child;
                child = 2 * parent + 1;
            }
            else
            {
                break;
            }
        }
    }

    void Push(const T& x)
    {
        _a.push_back(x);
        _adjustUp(_a.size()-1);
    }

    void _adjustUp(size_t child)
    {
        int parent = (child - 1) / 2;
        Compare<T> com;
        while (child>0)
        {
            if (com(_a[child],_a[parent]))
            {
                swap(_a[parent], _a[child]);
                child = parent;
                parent = (child - 1) / 2;
            }
            else
            {
                break;
            }
        }
    }

    size_t Size()
    {
        size_t size = _a.size();
        return size;
    }

    bool Empty()
    {
        assert(Size() >= 0);
        return Size() == 0;
    }

    void Pop()
    {
        assert(_a.Size() > 0);
        swap(_a[0], _a[Size - 1]);
        _a.pop_back();
        _adjustDown(0);        
    }

    T& GetTop()
    {
        return _a[0];
    }

    void Print()
    {
        cout << "大堆序列:" << endl;
        for (int i = 0; i < _a.size(); i++)
        {
            cout << _a[i] << "  ";
        }
        cout << endl;
    }
public:
    vector<T> _a;
};

template<class T, template<class> class Compare = Less>
class PriorityQueue
{
public:
    void Push(const T& x)
    {
        _hp.Push(x);
    }

    void Pop()
    {
        _hp.Pop();
    }

    size_t Size()
    {
        return _hp.Size();
    }

    bool Empty()
    {
        _hp.Empty();
    }

    T& Top()
    {
        return _hp.GetTop();
    }

    void Print()
    {
        _hp.Print();
    }
private:
    Heap<T,Compare> _hp;
};

建立PriorityQueue.cpp文件:

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include "PriorityQueue.hpp"

void Test()
{
    int a[] = { 10, 11, 13, 12, 16, 18, 15, 17, 14, 19 };
    PriorityQueue<int,Greater> pq;
    pq.Push(10);
    pq.Push(11);
    pq.Push(13);
    pq.Push(12);
    pq.Push(16);
    pq.Push(18);
    pq.Push(15);
    pq.Push(17);
    pq.Push(14);
    pq.Push(19);

    pq.Print();
}

int main()
{
    Test();
    system("pause");
    return 0;
}
时间: 2024-11-08 22:16:13

【数据结构】优先级队列的实现的相关文章

java数据结构与算法值优先级队列

一.优先级队列 什么是优先级队列:优先级队列是一种比栈和队列更加常用的一种数据结构.在优先级队列中,数据项按照关键字的值有序.数据项插入到队列中时,会按照顺序插入到合适的位置,用来保证队列的顺序. 生活中的例子,假设你有若干封件,你最急需要处理的文件就放在所有邮件的 顶部,如果不急需处理的文件就放放在下面. 参考代码: package edu.structure.queue; public class PriorityQ { private int maxSize; private int[]

浅谈算法和数据结构: 五 优先级队列与堆排序

转载自:http://www.cnblogs.com/yangecnu/p/Introduce-Priority-Queue-And-Heap-Sort.html 浅谈算法和数据结构: 五 优先级队列与堆排序 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话. 在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是

【python cookbook】【数据结构与算法】5.实现优先级队列

问题:要实现一个队列,它能够以给定的优先级对元素排序,且每次pop操作时都会返回优先级最高的那个元素: 解决方案:采用heapq模块实现一个简单的优先级队列 # example.py # # Example of a priority queue import heapq class PriorityQueue: def __init__(self): self._queue = [] self._index = 0 def push(self, item, priority): heapq.h

优先级队列(PriprityQueue)是一种什么样的数据结构

优先级队列(PriprityQueue)是一种无界队列,基于优先级堆,它的元素根据自然顺序或者通过实现Comparator接口的自定义排序方式进行排序.这篇文章,我们将创建一个Items的优先级队列,基于价格排序,优先级队列用来实现迪科斯彻算法(Dijkstra algorithm)非常实用.值得注意的是他的迭代器并不保证有序,如果需要按顺序遍历,最好使用Arrays.sort(pd.toArray())方法.同时它的实现不是同步的,意味着在多线程中不是线程安全的对象,可以取而代之的是Prior

【数据结构】用模版实现大小堆、实现优先级队列,以及堆排序

一.用模版实现大小堆 如果不用模版的话,写大小堆,就需要分别实现两次,但是应用模版的话问题就简单多了,我们只需要实现两个仿函数,Greater和Less就行了,仿函数就是用类实现一个()的重载就实现了仿函数.这个看下代码就能理解了.再设计参数的时候,需要把模版设计成模版的模版参数,因为要实现大小堆嘛!当我们实现好一个大堆或者小队的逻辑后只需要用模版接收的Greater或Less类定义一个变量,就能实现通用功能了. template<typename T> struct Less {     b

数据结构Java实现——队列的“奇葩”二 优先级队列

写在前面 有很多时候,一些数据的存储不仅需要先进先出,而且还有根据数据的优先级来排序,也就是优先级高的一定先出去,优先级相同的先进先出,此时就会用到优先级队列 应用 其实优先级队列的应用十分广泛,比如说构造哈夫曼树算法,再比如在一些计算机操作系统中用优先级队列来来满足抢先式多任务操作系统等等等等 代码实现 1.优先级队列存储的数据元素的描述 package org.Stone6762.entity; /** * @ClassName_PriorityQData优先级队列的结点中的数据部分的描述

【转】java中PriorityQueue优先级队列使用方法

优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列. 由于网上的资料大多将优先级队列各个方法属性,很少有实例讲解的,为方便大家以后使用,我就写了个demo~ 如果想实现按照自己的意愿进行优先级排列的队列的话,需要实现Comparator接口.下面的方法,实现了根据某个变

STL学习系列七:优先级队列priority_queue容器

1.简介 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL priority_queue 用来开发一些特殊的应用,请对stl的类库,多做扩展性学习 如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了.这样,我们就引入了优先级队列 这种数据结构. 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一

队列的应用:优先级队列

优先级队列:如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了. 优先级队列(priority queue)是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素(3)删除 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 .对于优先权相同的元素,可按先进先出次序处理或按任意优先权进行. 以上是网上常见的对优先级队列的描述.偷

优先级队列与堆排序

转自:http://www.cnblogs.com/yangecnu/p/Introduce-Priority-Queue-And-Heap-Sort.html 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话. 在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象.这种数据结构就是优先级队列(Pri