目录
一,队列的原理
队列是一种受限的线性表,(Queue),它是一种运算受限的线性表,先进先出(FIFO First In First Out)
-
队列是一种受限的线性结构
-
它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
生活中队列场景随处可见: 比如在电影院, 商场, 或者厕所排队。。。。。。
二,队列的算法实现
队列的算法实现1:使用数组
顺序存储 :
采用数组来保存队列的元素,设立一个队首指针 front ,一个队尾指针 rear,分别指向队首和队尾元素。则
rear-front 即为存储的元素个数!
定义方式为:
#define MaxSize 5 //队列的最大容量
typedef int DataType; //队列中元素类型
typedef struct Queue {
DataType queue[MaxSize];
int front; //队头指针
int rear; //队尾指针
}SeqQueue;
#include <iostream>
#include <Windows.h>
using namespace std;
typedef int Datatype; //队列中的元素类型
#define MAX_SIZE 5 //队列最大容量
typedef struct _Queue {
Datatype queue[MAX_SIZE];
int front;
int rear;
}Queue;
//初始化队列
bool initQueue(Queue* &Q) {
if(!Q) return false;
Q->front = Q->rear =0;
return true;
}
//判断队列是否为空
bool blankQueue(Queue* &Q) {
if(!Q) return false;
if(Q->rear == Q->front) return true;
return false;
}
//判断队列是否塞满
bool isFullQueue(Queue* &Q, Datatype data) {
if(!Q) return false;
if(Q->rear == MAX_SIZE) {
cout << "队列已满,不能将" << data << "排进队列" << endl;
return true;
}
return false;
}
//排进队列
void queueUp(Queue* &Q, Datatype data) {
if(!Q) return;
if(isFullQueue(Q, data)) return;
Q->queue[Q->rear] = data;
Q->rear++;
}
//删除队首: 方法一
bool deleteQueueFirst(Queue* &Q, int *data) {
if(!Q || blankQueue(Q)){
cout << "队列为空!" << endl;
return false;
}
if(!data) return false;
int i = Q->front;
--Q->rear;
*data = Q->queue[Q->front];
while(i != Q->rear) {
Q->queue[i] = Q->queue[i+1];
i++;
}
return false;
}
//删除队首: 方法二
bool deleteQueueFirst2(Queue* &Q, int *data) {
if(!Q || blankQueue(Q)){
cout << "队列为空!" << endl;
return false;
}
if(!data) return false;
if(Q->front == Q->rear) {
cout << "队列已到尽头!" << endl;
return false;
}
*data = Q->queue[Q->front];
Q->front++;
return true;
}
//获取队首元素
bool getFirstElem(Queue* &Q, Datatype *data) {
if(!Q || blankQueue(Q)){
cout << "队列为空!" << endl;
return false;
}
if(!data) return false;
*data = Q->queue[Q->front];
return true;
}
//队列的长度
int OueueLength(Queue* &Q) {
if(!Q) return 0;
return Q->rear - Q->front;
}
//清空队列
void deleteQueue(Queue* Q) {
Q->front = Q->rear = 0;
}
//打印队列
void printfQueue(Queue* &Q) {
if(!Q) return;
cout << "打印队列:";
if(Q->front == Q->rear) {
cout << "队列已到尽头!" << endl;
return ;
}
int i = Q->front;
while(i != Q->rear) {
cout << Q->queue[i] << " ";
i++;
}
cout << endl;
}
int main(void) {
Queue *Q = new Queue;
int data;
//初始化队列
initQueue(Q);
for(int i=0; i<7; i++) {
queueUp(Q, i);
}
printfQueue(Q);
for(int i=0; i<10; i++) {
if(deleteQueueFirst2(Q, &data))
cout << "出队的元素是:" << data << endl;
if(getFirstElem(Q, &data))
cout << "队首的元素是:" << data << endl;
printfQueue(Q);
}
system("pause");
return 0;
}
队列的算法实现2:使用链表
链式存储:
队列的链式存储结构,其实就是线性表的单链表,只不过它只是尾进头出而已,我们把它简称为链队列。为了
操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端节点 。
定义方式为:
typedef int DataType; //队列中元素类型
typedef struct _QNode {
//结点结构
DataType data;
struct _QNode *next;
}QNode;
typedef QNode * QueuePtr;
typedef struct Queue {
int length; //队列的长度
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
空队列时,front 和 rear 都指向空。
#include <iostream>
#include <Windows.h>
using namespace std;
typedef int Datatype; //队列中的数据类型
#define MAX_SIZE 5 //队列中的最大容量
typedef struct _QNode {
Datatype data;
struct _QNode *next;
}QNode;
typedef QNode* QueuePtr;
typedef struct _QueueLink {
int length; //队列长度
QueuePtr front; //指向队首
QueuePtr rear; //指向队尾
}QueueLink;
//队列初始化
bool initQueueLink(QueueLink* &QL) {
if(!QL) return false;
QL->length = 0;
QL->front = QL->rear = NULL;
return true;
}
//判断队列是否为空
bool isBlankQueueLink(QueueLink* &QL) {
if(!QL) return false;
if(!QL->front) return true;
return false;
}
//判断队列是否塞满
bool isFullQueueLink(QueueLink* &QL) {
if(!QL) return false;
if(QL->length == MAX_SIZE) return true;
return false;
}
//元素进入队列
bool enterElemQueueLink(QueueLink* &QL, Datatype data) {
if(!QL) return false;
if(isFullQueueLink(QL)) {
cout << "队列已满!无法将元素" << data << "插入到队列中!" << endl;
return fal