队列的实现
来源:互联网 发布:java 统计学 mahout 编辑:程序博客网 时间:2024/06/06 12:59
队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。 ———维基百科
我们可以用队列完成很多的操作,比如二叉树的层次遍历,以及消息队列等等。
我们这次要介绍的是队列中的循环队列
由于循环队列无法简单的通过rear==front来判断队列是否已满,因此通常有两种方法来解决这个问题。
1.另设一个标志位来判断队列是“空”还是“满”
2.少用一个元素空间,约定以“队列头指针在队列尾指针的下一位置”作为队列已满的标志。标志
头文件
#pragma once #define ElemType int#define QUEUE_SIZE 10typedef struct queue{ ElemType *base; //队列中的对象 int capacity; int front; int rear;}queue; //创建队列的类型void init_queue(queue *q); //初始化队列void push(queue *q, ElemType x); //入队操作void pop(queue *q); //出队ElemType gethead(queue *q); //获取队首void show_queue(queue *q); //遍历队列所有成员
头文件实现
#include<iostream>using namespace std;#include"queue.h"#include"assert.h"void init_queue(queue *q){ q->base = (ElemType *)malloc(sizeof(ElemType) * QUEUE_SIZE); assert(q->base != NULL); q->capacity = QUEUE_SIZE; q->front = q->rear = 0;}void push(queue *q, ElemType x){ if((q->rear+1)%q->capacity == q->front) { cout<<"队列已满,"<<x<<"不能入队."<<endl; return; } q->base[q->rear++] = x; q->rear = q->rear % q->capacity; //创建的为循环队列所以对capacity取模}void pop(queue *q){ if(q->front == q->rear) return; q->front++; q->front = q->front % q->capacity;}ElemType gethead(queue *q){ assert(q->front != q->rear); return q->base[q->front];}void show_queue(queue *q){ for(int i=q->front; i!=q->rear; ) { cout<<q->base[i]<<" "; i++; i = i%q->capacity; } cout<<endl;}
主函数部分
#include<iostream>using namespace std;#include"queue.h"int main(){ int i; queue q; init_queue(&q); for(i=0;i<10;i++) //因为循环队列需要空出一个存储单位,因此只能存到8 { push(&q,i); } show_queue(&q); pop(&q); pop(&q); cout<<"head="<<gethead(&q)<<endl;}
阅读全文
0 0
- 队列的实现:顺序队列
- 队列的实现:链式队列
- 队列----循环队列的实现
- 队列实现 队列的链式结构实现
- 堆栈,队列的实现
- 链队列的实现
- 队列的实现
- 队列的实现
- java 实现的队列
- 工作队列的实现
- 工作队列的实现
- 用链表实现的队列
- 队列的实现
- 队列的实现
- 队列的实现
- 队列的数组实现
- 循环队列的实现
- 数据结构 队列的实现
- myBatis数据查询理解
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.10多线程(4.10.5-4.10.10)
- warning:deprecated conversion from string constant to 'char *' 解决方案
- Kaggle 机器学习竞赛冠军及优胜者的源代码汇总
- 自定义控件格子布局:CellLayout
- 队列的实现
- 数据结构之链式队列
- android inflater的用法
- oracle存储过程中游标的使用
- 死锁的产生与解决
- 【算法】图的深度优先遍历
- Golang 调试
- 大学里常见的几个问题
- 常用类库API