优先队列C++数组实现

//优先队列

#include<iostream>

using namespace std;

class Queue

{

private:

struct Node //创建一个节点信息,包括数据和优先级

{

int data;

int level;

Node() :data(), level(-1){}

Node(int data_, int level_) :data(data_), level(level_){}

};

Node datas[5];

int front; //队首

int back;  //队尾

int cont;  //有效个数

public:

Queue() :front(), back(), cont(){}

void push(int data, int level) //压入数据

{

if (full()) //验满

{

cout << "满" << endl;

cin.get();

exit(1);

}

int temp = front;

for (int i = 0; i < cont; i++) //验证优先级

{

if (datas[temp%5].level < level) //把优先级别高的节点放在前面

{

Node t1 = datas[temp % 5];

datas[temp % 5] = { data, level };

for (int j = i; j < cont; j++)

{

Node t2 = datas[(temp + 1) % 5];

temp++;

datas[temp % 5] = t1;

t1 = t2;

}

back++; //队尾往后移一个

cont++; //有效个数加一

return;

}

temp++;

}

datas[back++ % 5] = { data, level };//如果当前数字优先级别最小,则放在队尾

cont++;

}

int pop() //弹出数据

{

if (empty())

{

cerr << "空" << endl;

cin.get();

exit(1);

}

cont--;

return datas[front++ % 5].data;

}

int get_front() //获取队首数据

{

return datas[front].data;

}

int get_back() //获取队尾数据

{

return datas[back].data;

}

void clear() //清空队列

{

front = cont = back = 0;

}

bool full() //判满

{

return cont > 4;

}

bool empty() //判空

{

return cont == 0;

}

int size()

{

return cont;

}

};

int main()

{

cin.get();

return 0;

}

时间: 2024-11-14 14:41:11

优先队列C++数组实现的相关文章

《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅴ

命题Q.对于一个含有N个元素的基于堆叠优先队列,插入元素操作只需要不超过(lgN + 1)次比较,删除最大元素的操作需要不超过2lgN次比较. 证明.由命题P可知,两种操作都需要在根节点和堆底之间移动元素,而路径的长度不超过lgN.对于路径上的每个节点,删除最大元素需要两次比比较(除了堆底元素),一次用来找出较大的子节点,一次用来确定该子节点是否需要上浮. 对于需要大量混杂的插入和删除最大元素操作的典型应用来说,命题Q意味着一个重要的性能突破(详见优先队列增长数量级表).使用有序或是无序数组的优

索引优先队列-IndexedPrirotyQueue的原理及实现(源码)

1.索引优先队列的意义 索引优先队列是一个比较抽象的概念,它是一个优先队列,又带有索引,这个索引是用来干什么的呢? 在正常的队列中,我们只能访问队列头元素,整个队列中的元素我们都无法访问.那么对于这些队列中的元素,如果我们有一个映射,能够知道队列中的第m个元素到底对应我们把所有元素加入优先队列之前的哪一个,那要使用它岂不是方便许多? 我们知道,在优先队列中,一个元素加入队列之后的顺序不是固定的,有可能上浮或者下沉.那么,我们怎么知道我们加入队列的这个元素,到底在队列中的什么位置呢? 这就是索引优

12170 - Easy Climb(DP+单调队列)

该题需要用数据结构来优化DP ,具体方法就是之前第八章讲的(用数据结构优化算法,紫书P241),使用一个数组和两个指针维护一个单调队列, 可以在O(n)的时间内求出滑动窗口中的最小值 . 有了这个优化我们就可以快速的求出dp[i-1][j](x-d<=j<=x+d)的最小值. 然而刘汝佳就是不这么做,他只用了一个指针,连维护优先队列的数组都没开,就"隐式的"求出了最小值 . 具体做法是: 1.先维护窗口左边界,别让指针k超出了窗口,如果x[k] < x[j] - d那

python数据结构学习笔记(九)

Priority Queues 9.1 ADT 9.2 implementing a priority queue 用无序的list来实现 用有序的列表来实现优先队列 9.3 heaps heap数据结构 使用堆来实现优先队列 基于数组实现的完全二叉树 使用最小优先队列来进行排序 adaptable priority queue Locators Priority Queues 9.1 ADT P.add(k, v) P.min(): return (k, v) P.remove_min():

读书笔记-算法

几个对数组的算法 1, 找出数组中的最大值: 1 2 3 4 5 double max = a[0]; for(int i = 1; i < a.length; i++) if(a[i] > max) max = a[i]; //把最大值马上设定为数组的第一个元素,然后遍历数组,如果有别当前这个最大值更大的元素,则把最大值更新,直到遍历结束: 2, 计算数组的平均值: 1 2 3 4 5 6 7 double sum = 0.0; for(int i = 0; i < a.length;

整合:图论存图方法及三种重要做法分析(Kruskal Dijkstra Bellman-Ford)

一.最短生成路的2种存图方法(邻接矩阵和邻接表): 1)邻接矩阵(适合稠密图即边远远多于点): 1.时间复杂度一般在n^2: 2.可以解决重边情况:map[i][j] = min( map[i][j] , input); 3.初始化:a[i][j] = INF;  a[i][i] = 0; 4.邻接矩阵点的最大极限在3000左右 5.图示: 2)邻接表(适合疏密图即边数近似于点数): 1.时间复杂度一般在mlog(n): 2.数组实现邻接表: ①定义:每个节点i都有一个链表,里面保存着从i出发的

Huffman树及其编码(STL array实现)

这篇随笔主要是Huffman编码,构建哈夫曼树有各种各样的实现方法,如优先队列,数组构成的树等,但本质都是堆. 这里我用数组来存储数据,以堆的思想来构建一个哈弗曼树,并存入vector中,进而实现哈夫曼编码 步骤: 1生成哈夫曼树  (取最小权值树和次小权值树生成新树,排列后重新取树,不断重复)    2编码   (遵循左零右一的原则)           3解码(是编码的逆向,本文还未实现,日后有机会补充) data.txt  测试数据: 51 2 3 4 5abcde 结果: 下面贴代码:

[luoguP2672] 推销员(贪心 + 树状数组 + 优先队列)

传送门 贪心...蒟蒻证明不会... 每一次找最大的即可,找出一次最大的,数列会分为左右两边,左边用stl优先队列维护,右边用树状数组维护.. (线段树超时了....) 代码 #include <queue> #include <cstdio> #include <iostream> #define N 100001 #define ls now << 1 #define rs now << 1 | 1 #define max(x, y) (p[

第一篇博客——基于数组的优先队列(java版)

看过园子里和CSND上那么多大牛精彩的博客后,早就按捺不住想亲手写上几篇.奈何每次坐在电脑前准备敲字的时候,立马赶到浑身不自在,无从下手.实在是因为自高考之后,大学以来,本人几乎就再没动笔写过一篇文字,写作水平退化实在严重.今天鼓起勇气开始写作博客,一方面希望通过多写慢慢地找回写作的感觉,一方面也希望通过博客和大家多多交流,共同进步. 既然是第一次试手,就写个简单易懂的内容——优先队列. 话不多说,先上代码. 1 /** 2 * @author Mr Left 3 * @version 1.0