队列学习 - 顺序存储法

队列学习 - 顺序存储法

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;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值