队列的定义以及实现
2018-03-05 13:22
267 查看
队列是只允许在一端进行插入操作,而在另外一端进行删除操作的线性表。
队列是一种先进先出的线性表,简称FIFO,允许插入的一端称之为队尾,允许删除的一端称之为队头。
线性表有顺序存储和链式存储,栈是线性表,队列作为一种特殊的线性表,也同样存在顺序存储结构和链式存储结构。
入队:在队列的末尾追加一个元素,不需要移动任何元素,其时间复杂度为O(1);
出队:队列元素的出列是在队头,即下标为0的位置,即队列中的所有元素都得向前移动,以保证队列的队头,也就是下标为0的位置不为空,其时间复杂度为O(n);
一般,操作队列,引入两个指针来表示,front指针指向队头元素,rear指针指向队尾元素的下一个位置,这样当front等于rear时,此队列不是还剩一个元素,而是空队列。
循环队列的定义:
顺序队列有一个缺点就是会造成假溢出,通过循环队列可以解决假溢出,使得顺序队列的rear指针指向下标为0的位置,通常把这种头尾相接的顺序存储结构称为循环队列。
判断队满的条件:
通用的计算队列长度的公式为:
循环队列的顺序存储结构的代码如下:
循环队列的初始化代码如下:
循环队列的入队操作代码如下:
循环队列的出队操作代码如下:
求队列的长度:
主函数中测试代码如下:
测试输出如下所示:
欢迎关注公众号,分享一些Unity3D、C#、C++数据结构和算法相关的学习知识。
队列是一种先进先出的线性表,简称FIFO,允许插入的一端称之为队尾,允许删除的一端称之为队头。
线性表有顺序存储和链式存储,栈是线性表,队列作为一种特殊的线性表,也同样存在顺序存储结构和链式存储结构。
入队:在队列的末尾追加一个元素,不需要移动任何元素,其时间复杂度为O(1);
出队:队列元素的出列是在队头,即下标为0的位置,即队列中的所有元素都得向前移动,以保证队列的队头,也就是下标为0的位置不为空,其时间复杂度为O(n);
一般,操作队列,引入两个指针来表示,front指针指向队头元素,rear指针指向队尾元素的下一个位置,这样当front等于rear时,此队列不是还剩一个元素,而是空队列。
循环队列的定义:
顺序队列有一个缺点就是会造成假溢出,通过循环队列可以解决假溢出,使得顺序队列的rear指针指向下标为0的位置,通常把这种头尾相接的顺序存储结构称为循环队列。
判断队满的条件:
(rear+1)%QueueSize==front
通用的计算队列长度的公式为:
(rear-front+QueueSize)%QueueSize
循环队列的顺序存储结构的代码如下:
#define MAXSIZE 10 typedef int QElemType; typedef struct { QElemType data[MAXSIZE]; int front; int rear; } SqQueue;
循环队列的初始化代码如下:
bool InitQueue(SqQueue *Q) { Q->front = 0; Q->rear = 0; return true; }
循环队列的入队操作代码如下:
//入队操作 bool EnQueue(SqQueue *Q, QElemType e) { if ((Q->rear + 1) % MAXSIZE == Q->front) { cout << "队满" << endl; return false; } //将队尾指针指向新插入元素 Q->data[Q->rear] = e; //将队尾rear指针向后移动一个位置 Q->rear = (Q->rear + 1) % MAXSIZE; //打印添加到队列中的元素 cout << e << endl; return true; }
循环队列的出队操作代码如下:
//出队操作 bool DeQueue(SqQueue *Q, QElemType *e) { //队列为空 if (Q->front == Q->rear) { cout << "队空" << endl; return false; } *e = Q->data[Q->front]; Q->front = (Q->front + 1) % MAXSIZE; //打印从队列中出队的元素 cout << *e << endl; return true; }
求队列的长度:
//求队列的长度 int GetQueueLength(SqQueue Q) { return (Q.rear - Q.front + MAXSIZE) % MAXSIZE; }
主函数中测试代码如下:
int main() { SqQueue *S = new SqQueue; SqQueue *Q = InitQueue(S); //入队10个元素 cout << "向队列中添加元素" << endl; for (auto i = 0; i < 10; i++) { EnQueue(Q, i); } //cout << "当前队列的长度为:" << GetQueueLength(*Q) << endl; //出队对中的元素,6个元素 cout << "将队列元素中的元素出队" << endl; int temp = 0; for (auto i = 0; i < 15; i++) { DeQueue(Q, &temp); } delete S; return 0; }
测试输出如下所示:
欢迎关注公众号,分享一些Unity3D、C#、C++数据结构和算法相关的学习知识。
相关文章推荐
- 队列的定义以及实现
- 数据结构(9)--链队列的定义以及相关操作的实现
- 实验四 栈和队列的定义与实现(未完成)
- 【STL】队列的实现以及应用
- 循环队列的判断满、空的三种方法以及具体代码实现(数组实现)
- 【数据结构】队列以及两个队列实现一个栈
- 数据结构-优先队列 接口定义与实现分析
- python基于mysql实现的简单队列以及跨进程锁实例详解
- 两个队列实现一个栈,要求实现Push以及Pop等方法
- Android生日礼物(含拼图游戏,背景音乐,自动拨号等功能实现)--根据代码规范修改注释以及定义
- 单链表操作,队列,栈实现,以及常见字符串库函数经典实现
- 聊聊高并发(十四)理解Java中的管程,条件队列,Condition以及实现一个阻塞队列
- java中的接口的定义以及实现关系
- 数据结构与算法(4)---Java语言实现:队列的单链表定义
- (C语言版)栈和队列(一)——实现链式栈和链式队列的基本操作以及遇到的问题
- springboot 集成rabbitmq 并采用ack模式 以及封装队列定义
- 栈的定义和存储以及算法实现
- java实现rabbitMQ延时队列详解以及spring-rabbit整合教程
- C语言,函数的声明,定义,以及调用(实现).举例应用.学了这么长时间,初步明白,汗颜啊
- 数据结构之队列的定义与简单实现