顺序队列的实现
*队列的特点是先进先出
*在顺序结构中, 是用一个数组作为排队的场地.
*要想要更好利用空间, 解决队列的假溢出问题, 我们使用循环队.
*顺序循环队列的几个关键位置图示如下:
(图片来源域陈越老师主编的<<数据结构>>)
========================================分割线==============================================
*标准的抽象数据类型定义
类型名称:队列(Queue)
操作对象集:一个拥有0个或者说多个同种元素类型的有穷线性表
操作集:(假定队列元素类型为ElementType, 队列类型名为Queue)
1) Queue* CreateQ() :生成一个队列.
2) int IsEmpty(Queue *Q): 判断一个队列是否为空.
3) int IsFull(Queue *Q): 判断一个队列是否已经满了.
4) void AddQ(Queue *Q, ElementTpye Ele): 向队列Q中添加一个元素Ele.
5) ElementType DeleteQ(Queue *Q): 弹出队列q中的元素.
========================================分割线==============================================
*使用C语言代码实现顺序循环队列
#include <stdio.h> #define MaxSize 100 /* 循环顺序队列为空时候示意图是什么样子? 只有一个元素的时候是什么样子? 元素慢员的时候是什么样子? 元素满员的时候front和rear的数学关系是什么? */ //定义结构 typedef int ElementType; typedef struct _Queue { //数据域 ElementType Data[MaxSize]; //队头指针 int front; //队尾指针 int rear; } Queue; //创建一个队列 Queue* CreateQ() { Queue *Q; //为数据域申请空间 Q = malloc(sizeof(Q->Data)); //初始化开队头队尾指针 Q->front = Q->rear = -1; //返回 return Q; } //判断队列是否为空 int IsEmpty(Queue *Q) { return Q->rear == Q->front; /*当队尾与队头相等的时候, 队满*/ } //判断队列是否满了 int IsFull(Queue *Q) { if((Q->rear+1) % MaxSize == Q->front) { return 1; } else { return 0; } } //添加新元素 void AddQ(Queue *Q, ElementType Ele) { //判断是否队满 if(IsFull(Q)) { return; } else { //rear+1 Q->rear = (Q->rear+1)%MaxSize; //对应位置上的元素改变 Q->Data[Q->rear] = Ele; } } //删除元素 ElementType DeleteQ(Queue *Q) { //判断队列是否为空 if(IsFull(Q)) { return; } else { //front++ Q->front = (Q->front+1)%MaxSize; } } int main(int argc, char *argv[]) { Queue *Q = CreateQ(); printf("Q.IsEmpty=%d\n", IsEmpty(Q)); return 0; }
*关于判断队列满的代码的思考(注意, 这儿是循环队列, 要多用模的思维, 多与时钟做对比)
队列什么时候满?
自然语言: 当队列的尾部刚好与队列的头部挨着并且队列的尾部比头部下标刚好多MaxSize-1.
数学解释:(rear+1)%MaxSize = front
其他同理.
欢迎评论指教, QQ:1158375969