队列和优先队列

忘是亡心i 2022-08-08 14:43 373阅读 0赞

队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素成为出队。因为队列只允许在一段插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。

顺序队列,循环队列。

以数组为例进行队列的实现

队列数据结构:

  1. typedef struct queue
  2. {
  3. int queuesize; //数组的大小
  4. int head, tail; //队列的头和尾下标
  5. int *q; //数组头指针
  6. }Queue;

队列初始化

  1. void InitQueue(Queue *q)
  2. {
  3. q->queuesize = 8;
  4. q->q = (int *)malloc(sizeof(int) * q->queuesize); //分配内存
  5. q->tail = 0;
  6. q->head = 0;
  7. }

进队列

  1. void EnQueue(Queue *q, int key)
  2. {
  3. int tail = (q->tail+1) % q->queuesize;
  4. //取余保证,当quil=queuesize-1时,再转回0
  5. if (tail == q->head) //此时队列没有空间
  6. {
  7. printf("the queue has been filled full!");
  8. }
  9. else
  10. {
  11. q->q[q->tail] = key;
  12. q->tail = tail;
  13. }
  14. }

出队列

  1. int DeQueue(Queue *q)
  2. {
  3. int tmp;
  4. if(q->tail == q->head) //判断队列不为空
  5. {
  6. printf("the queue is NULL\n");
  7. }
  8. else
  9. {
  10. tmp = q->q[q->head];
  11. q->head = (q->head+1) % q->queuesize;
  12. }
  13. return tmp;
  14. }
  15. 判断队列是否为空
  16. int IsQueueEmpty(Queue *q)
  17. {
  18. if(q->head == q->tail)
  19. {
  20. return 1;
  21. }
  22. else
  23. {
  24. return 0;
  25. }
  26. }

以上这些只是自己实现一下,标准库里面都有标准的库函数

头文件为

队列提供了下面的操作

q.empty() //如果队列为空返回true,否则返回false

q.size() //返回队列中元素的个数

q.pop() //删除队列首元素但不返回其值

q.front() // 返回队首元素的值,但不删除该元素

q.push() // 在队尾压入新元素

q.back() // 返回队列尾元素的值,但不删除该元素

优先队列

优先队列:顾名思义,首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队~

百度百科上这样描述的:优先级队列 是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。

在优先队列中,优先级高的元素先出队列。

标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。

优先队列的用法,也是最常用的用法:priority_queue q;

通过<操作符可知在整数中元素大的优先级高。

故将2,3,5,6,9插入队列输出的话结果为9,6,5,3,2。

如果我们要把元素从小到大输出怎么办呢?

这时我们可以传入一个比较函数,使用functional(头文件)函数对象作为比较函数。

priority_queue, greater >q;

  1. //注意“>>”会被认为错误,这是右移运算符,所以这里用空格号隔开

其中,第二个参数为容器类型,第三个参数为比较函数

所以这样定义之后,上面的输出就为2,3,5,6,9。

priority_queue,less >q;//最大值优先

当然了,其中的greater与less也可以自己定义

struct cmp1{

  1. bool operator ()(int &a,int &b)\{
  2. return a>b;//最小值优先
  3. \}

};

struct cmp2{

  1. bool operator ()(int &a,int &b)\{
  2. return a<b;//最大值优先
  3. \}

};

priority_queue,cmp1>q;//最小值优先

priority_queue,cmp2>q;//最大值优先

结构体自定义优先级方法

struct node

{

  1. int w,id;
  2. //node(int w=0,int id=0):w(w),id(id)\{\}//结构体的构造函数
  3. //结构体默认的是不带参数的构造函数
  4. bool operator < (const node& u)const
  5. \{
  6. if(w!=u.w)return w < u.w;//最大值优先
  7. return id > u.id;//最小值优先
  8. //优先队列排序问题,w从大到小排列,
  9. //w相同就id由小到大排列
  10. \}

};

priority_queue q ;

//自定义的时候只能使用”<”,不能使用”>”,因为标准库默认使用<操作符来确定优先级关系,自定义的>与<操作符并没有直接的联系,所以使用>会通不过编译。(蓝色处)

基本操作和队列差不多

Q.top(); //返回队列头部元素

Q.pusu(); //在队列尾部插入数据

Q.pop(); //队列头部数据出队

Q.enpty(); //判断队列是否为空

Q.size(); //返回队列中数据的个数

#

发表评论

表情:
评论列表 (有 0 条评论,373人围观)

还没有评论,来说两句吧...

相关阅读

    相关 队列优先队列

    队列 队列是一种特殊的[线性表][Link 1],特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作

    相关 优先队列

    优先队列:顾名思义,首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时有一定的选择性,即根据元素的属性选择某一项值最

    相关 优先队列

    [为什么80%的码农都做不了架构师?>>> ][80_] ![hot3.png][] 优先队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。