一、概念
1、队列的定义
队列 是仅限在 一端 进行 插入,另一端 进行 删除 的 线性表。
队列 又被称为 先进先出 (First In First Out) 的线性表,简称 FIFO 。
2、队首
允许进行元素删除的一端称为 队首。如下图所示:
3、队尾
允许进行元素插入的一端称为 队尾。如下图所示:
二、接口
1、可写接口
1)数据入队
队列的插入操作,叫做 入队。它是将 数据元素 从 队尾 进行插入的过程,如图所示,表示的是 插入 两个数据(绿色 和 蓝色)的过程:
2)数据出队
队列的删除操作,叫做 出队。它是将 队首 元素进行删除的过程,如图所示,表示的是 依次 删除 两个数据(红色 和 橙色)的过程:
3)清空队列
队列的清空操作,就是一直 出队,直到队列为空的过程,当 队首 和 队尾 重合时,就代表队尾为空了,如图所示:
2、只读接口
1)获取队首数据
对于一个队列来说只能获取 队首 数据,一般不支持获取 其它数据。
2)获取队列元素个数
队列元素个数一般用一个额外变量存储,入队 时加一,出队 时减一。这样获取队列元素的时候就不需要遍历整个队列。通过 O(1) 的时间复杂度获取队列元素个数。
3)队列的判空
当队列元素个数为零时,就是一个 空队,空队 不允许 出队 操作。
三、队列的顺序表实现
1、数据结构定义
对于顺序表,在 C语言 中表现为 数组,在进行 队列的定义 之前,我们需要考虑以下几个点:
1)队列数据的存储方式,以及队列数据的数据类型;
2)队列的大小;
3)队首指针;
4)队尾指针;
我们可以定义一个 队列 的 结构体,C语言实现如下所示:
#define MAXSIZE 10 typedef int datatype; typedef struct seqqueue{ datatype data[MAXSIZE]; int front,rear; }seq_queue,*seq_pqueue;
2、初始化创造队列
第一种无形参,C语言实现如下所示:
seq_pqueue init1_seqqueue(void) { seq_pqueue q; q=(seq_pqueue)malloc(sizeof(seq_queue)); if(q==NULL) { perror("malloc"); exit(-1); } q->front=q->rear=MAXSIZE-1; return q; }
第二种有形参,C语言实现如下所示:
void init_seqqueue(seq_pqueue *Q) { *Q=(seq_pqueue)malloc(sizeof(seq_queue)); if((*Q)==NULL) { perror("malloc"); exit(-1); } (*Q)->front=(*Q)->rear=MAXSIZE-1; return; }
3、判断队列是否满
C语言实现如下所示:
bool is_full_seqqueue(seq_pqueue q) { if((q->rear+1)%MAXSIZE == q->front) return true; else return false; }
4、判断队列是否空
C语言实现如下所示:
bool is_empty_seqqueue(seq_pqueue q) { if(q->rear == q->front) return true; else return false; }
5、入队C语言实现如下所示:
bool in_seqqueue(datatype data,seq_pqueue q) { //判断队列是否满 if(is_full_seqqueue(q)){ printf("队列已满!\n"); return false; } //入队 q->rear=(q->rear+1)%MAXSIZE; q->data[q->rear]=data; return true; }
数据结构——顺序队列与链式队列的实现-2