91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【數據結構】優先級隊列的實現(適配器模式)

發布時間:2020-06-21 09:50:12 來源:網絡 閱讀:395 作者:韓靜靜 欄目:編程語言

代碼按照適配器模式實現,若理解了堆的內部怎么實現的,那優先級的隊列實現則是非常簡單的了,堆的設計大家不明白的話,可以查看我的博客http://10740184.blog.51cto.com/10730184/1767076


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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辽宁省| 平湖市| 西藏| 安顺市| 左云县| 新营市| 甘孜| 桑植县| 独山县| 卢氏县| 稷山县| 改则县| 北票市| 汉源县| 密云县| 普定县| 禄丰县| 朝阳区| 四平市| 唐河县| 南康市| 广饶县| 安溪县| 崇明县| 黑山县| 建平县| 和平区| 区。| 阿瓦提县| 荃湾区| 康乐县| 营山县| 舟山市| 阿城市| 武宣县| 临清市| 精河县| 孟津县| 若羌县| 建始县| 永宁县|