• 队列的简单使用


    以下代码是优先队列的简单使用

    #include<iostream>
    #include<queue>
    #include<cstdio>
    using namespace std;
    
    int main()
    {
        priority_queue<int> q;//声明一个从到小排序的队列q 
        q.push(5);//插入值 
        q.push(8);
        q.push(1);
        while(!q.empty())//判断至队列为空 
        {
            cout << q.top() << endl;//取队头元素 
            q.pop();//删除队头元素 
        }
        return 0;
    }

    二叉树堆的实现

     

     

    设置左儿子的编号是其双亲编号 i*2+1

    设置右儿子的编号是其双亲编号 i*2+2

    下面给出核心代码

    #define MAX_N 100
    int heap[MAX_N],sz = 0;
    void push(int x)//heap数组代表代表此时的双亲位置元素,传入的值x为待操作的数 
    {
        //自己节点的编号 
        int i = sz++;
        while(i > 0)
        {
    //        双亲节点的编号 
            int p = (i - 1) / 2;
    //        如果已经没有大小颠倒则退出 
            if(heap[p] <= x)
                break;
    //        把双亲节点的数值放下来,而把自己提上去 
            heap[i] = heap[p];
            i = p;
        }
        heap[i] = x;
    }
    
    int pop()
    {
    //    ret代表最小值 
        int ret = heap[0];
    //    要提到根节点的值 
        int x = heap[sz--];
    //    从根开始向下交换 
        int i = 0;
        while(i * 2 + 1 < sz)
        {
    //        比较儿子的值 
            int a = i * 2 + 1;//左儿子 
            int b = i * 2 + 2;//右儿子 
            if(b < sz && heap[b] < heap[a])
                a = b;
    //        如果已经没有大小颠倒则退出 
            if(heap[a] >= x)
                break;
    //        把儿子的数值提上来 
            heap[i] = heap[a];
            i = a;
        }
        heap[i] = x;
        return ret;
    }
  • 相关阅读:
    RandomAccessFile类
    IO_ObjectOutputStream(对象的序列化)
    IO流_文件切割与合并(带配置信息)
    IO流_文件切割与合并
    IO流_SequenceInputStream(序列流)
    10-stack
    9-queue
    16-两种方法全排列
    8-全排列next_permutation
    15-Call to your teacher(有向图的连通判断)
  • 原文地址:https://www.cnblogs.com/biaobiao88/p/11767068.html
Copyright © 2020-2023  润新知