目录
一. 使用数组
(1)队列定义
队列图示
队列是一种受限制的线性结构
只允许在表的前端(front)进行删除操作, 而在表的后端(rear)进行插入操作
(2)顺序存储实现
入队
满队列
1.元素类型
#define MaxSize 5 //最大容量
typedef int DataType; //元素类型
typedef struct Queue
{
DataType queue[MaxSize];
int front;
int rear;
}SeqQueue;
2.判断队列
判断队列状态, front等于rear表示当前队列为空
rear为最大值时,表示状态为满
/*是否为空*/
int IsEmpty(SeqQueue* SQ)
{
if (!SQ) return 0;
if (SQ->front == SQ->rear)
{
return 1;
}
return 0;
}
/*是否为满*/
int IsFull(SeqQueue* SQ)
{
if (!SQ) return 0;
if (SQ->rear == MaxSize)
{
return 1;
}
return 0;
}
3.初始化队列
置空即可
void InitQueue(SeqQueue *SQ)
{
if (!SQ) return;
SQ->front = SQ->rear = 0;
}
4.元素插入
/*入队*/
int EnterQueue(SeqQueue* SQ, DataType data)
{
if (!SQ) return 0;
if(IsFull(SQ))
{
cout << "队列已满" << endl;
return 0;
}
SQ->queue[SQ->rear] = data;
SQ->rear++;
return 1;
}
5.遍历
/*遍历数组*/
void PrintQuere(SeqQueue* SQ)
{
if (!SQ) return;
int i = SQ->front;
while (i<SQ->rear)
{
cout << SQ->queue[i] << "\t";
i++;
}
cout << endl;
}
6.删除
① 删除 front 所指的元素, 后面所有元素前移 1 并返回被删除元素
两个元素的队列,删除A1,A2左移,rear-1
删除一个元素后
代码实现
/*出队,第一种方式,后面元素向前移动*/
int DeleteQueue(SeqQueue* SQ)//, DataType data)
{
if (!SQ || IsEmpty(SQ))
{
cout << "队列为空!" << endl;
return 0;
}
//data = SQ->queue[SQ->front];
for (int i = SQ->front + 1; i <= SQ->rear; ++i)
{
SQ->queue[i - 1] = SQ->queue[i];
}
SQ->rear--;
}
② 删除 front 所指的元素,然后加 1 并返回被删元素
两个元素的队列,删除A1,front+1
删除一个元素后
代码实现
/*出队, 第二种方式, front后移一位,这会导致空间越来越小... */
int DeleteQueue2(SeqQueue* SQ)//,DataType data)
{
if (!SQ || IsEmpty(SQ))
{
cout << "队列为空!" << endl;
return 0;
}
if (SQ->front >= MaxSize)
{
cout << "队列已到尽头!" << endl;
return 0;
}
SQ->queue[SQ->front] = NULL;
SQ->front++;
return 1;
}
7.清空队列
//清空队列
void ClearQueue(SeqQueue* SQ)
{
if (!SQ) return;
SQ->front = SQ->rear = 0;
}
8.获取队列元素个数
//获取队列中元素的个数
int getLength(SeqQueue* SQ)
{
if (!SQ) return 1;
SQ->front = SQ->rear = 0;
}
使用数组实现队列完整代码
#include <iostream>
using namespace std;
#define MaxSize 5 //最大容量
typedef int DataType; //元素类型
typedef struct Queue
{
DataType queue[MaxSize];
int front;
int rear;
}SeqQueue;
//初始化
void InitQueue(SeqQueue *SQ)
{
if (!SQ) return;
SQ->front = SQ->rear = 0;
}
/*遍历数组*/
void PrintQuere(SeqQueue* SQ)
{
if (!SQ) return;
int i = SQ->front;
while (i<SQ->rear)
{
cout << SQ->queue[i] << "\t";
i++;
}
cout << endl;
}
/*是否为空*/
int IsEmpty(SeqQueue* SQ)
{
if (!SQ) return 0;
if (SQ->front == SQ->rear)
{
return 1;
}
return 0;
}
/*是否为满*/
int IsFull(SeqQueue* SQ)
{
if (!SQ) return 0;
if (SQ->rear == MaxSize)
{
return 1;
}
return 0;
}
/*入队*/
int EnterQueue(SeqQueue* SQ, DataType data)
{
if (!SQ) return 0;
if (IsFull(SQ))
{
cout << "队列已满" << endl;
return 0;
}
SQ->queue[SQ->rear] = data;
SQ->rear++;
return 1;
}
/*出队,第一种方式,后面元素向前移动*/
int DeleteQueue(SeqQueue* SQ)//, DataType data)
{
if (!SQ || IsEmpty(SQ))
{
cout << "队列为空!" << endl;
return 0;
}
//data = SQ->queue[SQ->front];
for (int i = SQ->front + 1; i <= SQ->rear; ++i)
{
SQ->queue[i - 1] = SQ->queue[i];
}
SQ->rear--;
return 1;
}
/*出队, 第二种方式, front后移一位,这会导致空间越来越小... */
int DeleteQueue2(SeqQueue* SQ)//,DataType data)
{
if (!SQ || IsEmpty(SQ))
{
cout << "队列为空!" << endl;
return 0;
}
if (SQ->front >= MaxSize)
{
cout << "队列已到尽头!" << endl;
return 0;
}
SQ->queue[SQ->front] = NULL;
SQ->front++;
return 1;
}
//清空队列
void ClearQueue(SeqQueue* SQ)
{
if (!SQ) return;
SQ->front = SQ->rear = 0;
}
int main()
{
SeqQueue* SQ = new SeqQueue;
//DataType data;
//初始化
InitQueue(SQ);
//入队
int i;
for (i=0; i < 5; i++) {
if (EnterQueue(SQ, i))
{
cout << "插入成功" << endl;
}
else
{
cout << "插入失败" << endl;
}
}
cout << "队列元素:";
PrintQuere(SQ);
//DeleteQueue(SQ);
cout << "删除队列front指向的元素:";
DeleteQueue2(SQ);
cout << "剩下的队列元素:";
PrintQuere(SQ);
return 0;
}
二. 使用链式
队列的链式存储结构,其实就是线性表的单链表,只不过它只是尾进头出而已,我们把它简称为链队列。为了 操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端节点
1.元素类型
#define MaxSize 5 //最大容量
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;
2.队列初始化
空的队列
void InitQueue(LinkQueue* LQ)
{
if (!LQ) return;
LQ->length = 0;
LQ->front = LQ->rear = nullptr;
}
3.插入元素
插入一个元素,有些区别,需要单独处理
插入第二个元素
//判断队列为空
int IsEmpty(LinkQueue *LQ)
{
if(!LQ) return 0;
if (LQ->front == NULL)
{
return 1;
}
return 0;
}
//判断队列是否为满
int IsFull(LinkQueue *LQ)
{
if(!LQ) return 0;
if (LQ->length == MaxSize)
{
return 1;
}
return 0;
}
//入队
int EnterQueue(LinkQueue* LQ, DataType data)
{
if (!LQ) return 0;
if (IsFull(LQ))
{
cout << "无法插入元素" << data << ", 队列已满" << endl;
}
QNode* qNode = new QNode;
qNode->data = data;
qNode->next = NULL;
if (IsEmpty(LQ))
{
LQ->front = LQ->rear = qNode;
}
else
{
LQ->rear->next = qNode;
LQ->rear = qNode;
}
LQ->length++;
return 1;
}
4.删除元素
出列后不存在其他元素,rear也置空
rear不用清空
int DeleteQueue(LinkQueue *LQ)//,DateType *date)
{
QNode* tmp = NULL;
if (!LQ || IsEmpty(LQ))
{
cout << "队列为空" << endl;
return 0;
}
tmp = LQ->front;
LQ->front = tmp->next;
if (!LQ->front) LQ->rear = NULL;//出队后不存在其他元素,将rear也置空
LQ->length--;
return 1;
}
完整代码
#include <iostream>
#define MaxSize 5
using namespace std;
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;
void InitQueue(LinkQueue* LQ)
{
if (!LQ) return;
LQ->length = 0;
LQ->front = LQ->rear = nullptr;
}
//判断队列为空
int IsEmpty(LinkQueue *LQ)
{
if(!LQ) return 0;
if (LQ->front == NULL)
{
return 1;
}
return 0;
}
//判断队列是否为满
int IsFull(LinkQueue *LQ)
{
if(!LQ) return 0;
if (LQ->length == MaxSize)
{
return 1;
}
return 0;
}
int EnterQueue(LinkQueue* LQ, DataType data)
{
if (!LQ) return 0;
if (IsFull(LQ))
{
cout << "无法插入元素" << data << ", 队列已满" << endl;
return 0;
}
QNode* qNode = new QNode;
qNode->data = data;
qNode->next = NULL;
if (IsEmpty(LQ))
{
LQ->front = LQ->rear = qNode;
}
else
{
LQ->rear->next = qNode;
LQ->rear = qNode;
}
LQ->length++;
return 1;
}
int DeleteQueue(LinkQueue *LQ)//,DateType *date)
{
QNode* tmp = NULL;
if (!LQ || IsEmpty(LQ))
{
cout << "队列为空" << endl;
return 0;
}
tmp = LQ->front;
LQ->front = tmp->next;
if (!LQ->front) LQ->rear = NULL;//出队后不存在其他元素,将rear也置空
LQ->length--;
return 1;
}
// 打印
void PrintQueue(LinkQueue* LQ)
{
QueuePtr tmp;
if (!LQ) return; if (LQ->front == NULL)
{
cout << "队列为空!"; return;
}
tmp = LQ->front;
while (tmp)
{
cout << tmp->data << " ";
tmp = tmp->next;
}
cout << endl;
}
//清空队列
void ClearQueue(LinkQueue* LQ)
{
if (!LQ) return;
while (LQ->front)
{
QueuePtr tmp = LQ->front->next;
delete LQ->front;
LQ->front = tmp;
}
LQ->front = LQ->rear = NULL;
LQ->length = 0;
}
int main(void)
{
LinkQueue* LQ = new LinkQueue;
//DataType data = -1;
//初始化队列
InitQueue(LQ);
//入队
for (int i = 0; i < 7; i++)
{
if (EnterQueue(LQ, i))
{
cout << "插入成功" <<endl;
}
else
{
cout << "插入失败" << endl;
}
}
cout << "当前值为:" << endl;
PrintQueue(LQ);
//出队
if (DeleteQueue(LQ))
{
cout << "出队后:" << endl;
PrintQueue(LQ);
}else
{
cout << "出队失败" << endl;
}
ClearQueue(LQ);
delete LQ;
return 0;
}