队列学习 - 顺序存储法
1. 队列的原理
队列是一种受限的线性表,(Queue),它是一种运算受限的线性表,先进先出(FIFO First In First Out).
队列是一种受限的线性结构.
它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
生活中队列场景随处可见: 比如在电影院, 商场, 或者厕所排队。。。。。。
2. 代码实现
1. 顺序队列结构体定义
#define MAXSIZE 5 //最大队列数
typedef int DataType; //int的别名
typedef struct Queue {
DataType queue[MAXSIZE];//队列数组
int front; //队头指针
int rear; //队尾指针
}SeqQueue; //结构体别名
2. 初始化顺序队列
//队列初始化, 将队列初始化为空队列
void InitQueue(SeqQueue *SQ) {
if (!SQ) return; //队列合法性检查
SQ->front = SQ->rear = 0; //把队头和队尾指针同时置零
}
3. 判断队列为空
//判断队列为空
int IsEmpty(SeqQueue *SQ) {
if (!SQ) return 0;
if (SQ->front == SQ->rear) { //如果队头和队尾相等,队列为空
return 1;
}
return 0;
}
4. 判断队列是否为满
int IsFull(SeqQueue *SQ) {
if (!SQ) return 0;
if (SQ->rear == MAXSIZE) { //队尾指针和最大队列数相等,队列为满
return 1;
}
return 0;
}
5. 入队
//入队,将元素data插入到队列SQ中
int EnterQueue(SeqQueue *SQ, DataType data) {
if (!SQ) return 0;
if (IsFull(SQ)) {
cout << "无法插入元素 " << data << ",队列已满!" << endl;
return 0;
}
SQ->queue[SQ->rear] = data; //在队尾插入元素data
SQ->rear++; //队尾指针指向下一个位置
return 1;
}
6. 出队
//出队,将队列中队头的元素data出队,后面的元素向前移动
int DeleteQueue(SeqQueue *SQ, DataType *data) {
if (!SQ || IsEmpty(SQ)) {
cout << "队列为空!" << endl;
return 0;
}
if (!data) return 0;
*data = SQ->queue[SQ->front]; //将要出队的元素赋值给 data 用于打印
for (int i = SQ->front + 1; i < SQ->rear; i++) { //队首出队后,后面的所有数据往前移一步
SQ->queue[i - 1] = SQ->queue[i];
}
SQ->rear--;//队尾指针前移一位
return 0;
}
7. 打印队列中的各元素
//打印队列中的各元素
void PrintQueue(SeqQueue *SQ) {
if (!SQ) return;
int i = SQ->front;
while (i < SQ->rear) {
cout << setw(4) << SQ->queue[i];
i++;
}
}
8. 获取队首元素,不出队
//获取队首元素,不出队
int GetHead(SeqQueue *SQ, DataType *data) {
if (!SQ || IsEmpty(SQ)) {
cout << "队列为空!" << endl;
return 0;
}
return *data = SQ->queue[SQ->front];
}
9. 清空队列
//清空队列
void ClearQueue(SeqQueue *SQ) {
if (!SQ) return;
SQ->front = SQ->rear = 0;
}
10. 清空队列
//获取队列中元素的个数
int getLength(SeqQueue *SQ) {
if (!SQ) return 0;
return SQ->rear - SQ->front;
}
11. 测试队列代码
int main(void) {
SeqQueue *SQ = new SeqQueue;
DataType data;
//初始化队列
InitQueue(SQ);
//入队
for (int i = 0; i < 7; i++) {
EnterQueue(SQ, i);
}
//打印队列中的元素
cout << "队列中的元素(总共"<< getLength(SQ) <<"个): " << endl;
PrintQueue(SQ);
cout << endl;
//出队
if (DeleteQueue2(SQ, &data)) {
cout << "出队的元素是: " << data << endl;
}
else {
cout << "出队失败!" << endl;
}
//打印队列中的剩下元素
cout << "出队一个元素后, 队列中的剩下元素: " << endl;
PrintQueue(SQ);
cout << endl;
system("pause");
return 0;
}
12. 运行结果
13. 完整代码
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <Windows.h>
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; //把队头和队尾指针同时置零
}
//判断队列为空
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;
}
//入队,将元素data插入到队列SQ中
int EnterQueue(SeqQueue *SQ, DataType data) {
if (!SQ) return 0;
if (IsFull(SQ)) {
cout << "无法插入元素 " << data << ",队列已满!" << endl;
return 0;
}
SQ->queue[SQ->rear] = data; //在队尾插入元素data
SQ->rear++;
return 1;
}
//出队,将队列中队头的元素data出队,后面的元素向前移动
int DeleteQueue(SeqQueue *SQ, DataType *data) {
if (!SQ || IsEmpty(SQ)) {
cout << "队列为空!" << endl;
return 0;
}
if (!data) 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 0;
}
//出队2, 将队列中队头的元素data出队,出队后队头指针front后移一位
int DeleteQueue2(SeqQueue *SQ, DataType *data) {
if (!SQ || IsEmpty(SQ)) {
cout << "队列为空!" << endl;
return 0;
}
if (SQ->front >= MAXSHORT) {
cout << "队列已到尽头!" << endl;
return 0;
}
*data = SQ->queue[SQ->front]; //出队元素值
SQ->front = (SQ->front) + 1; //队首指针后移一位
return 1;
}
//打印队列中的各元素
void PrintQueue(SeqQueue *SQ) {
if (!SQ) return;
int i = SQ->front;
while (i < SQ->rear) {
cout << setw(4) << SQ->queue[i];
i++;
}
}
//获取队首元素,不出队
int GetHead(SeqQueue *SQ, DataType *data) {
if (!SQ || IsEmpty(SQ)) {
cout << "队列为空!" << endl;
return 0;
}
return *data = SQ->queue[SQ->front];
}
//清空队列
void ClearQueue(SeqQueue *SQ) {
if (!SQ) return;
SQ->front = SQ->rear = 0;
}
//获取队列中元素的个数
int getLength(SeqQueue *SQ) {
if (!SQ) return 0;
return SQ->rear - SQ->front;
}
int main(void) {
SeqQueue *SQ = new SeqQueue;
DataType data;
//初始化队列
InitQueue(SQ);
//入队
for (int i = 0; i < 7; i++) {
EnterQueue(SQ, i);
}
//打印队列中的元素
cout << "队列中的元素(总共"<< getLength(SQ) <<"个): " << endl;
PrintQueue(SQ);
cout << endl;
//出队
//for (int i = 0; i < 10; i++) {
if (DeleteQueue2(SQ, &data)) {
cout << "出队的元素是: " << data << endl;
}
else {
cout << "出队失败!" << endl;
}
//}
//打印队列中的剩下元素
cout << "出队一个元素后, 队列中的剩下元素: " << endl;
PrintQueue(SQ);
cout << endl;
system("pause");
return 0;
}