20200117 数据结构和算法之顺序存储的队列

本文介绍了顺序存储的队列数据结构,遵循先入先出原则。队列由头指针front和尾指针rear管理,初始化函数为initQueue。出列操作有两种方式,本文选择通过移动front指针实现,避免大量数据时的系统开销。提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顺序存储的队列遵循先入先出的原则,其结构构成如下:

typedef struct _sqlQueue {
	datatype* data;
	int front;
	int rear;
}sqlQueue;

其中front为头指针,指向起始位置,rear为尾指针,指向最后一个位置,rear-font即为元素的个数。图示如下:在这里插入图片描述初始化函数为bool initQueue(sqlQueue*& sq);

bool initQueue(sqlQueue*& sq) {
	sq->data = new datatype[MAX_SIZE];
	if (!sq->data) return true;
	sq->front = sq->rear = 0;
	return true;
}

其他都是常规操作,添加元素(入列)、遍历、清空队列、销毁队列、获取队列的长度。特殊的出列(遵循先进先出的原则),有两种方式,一种是采用数组的方式,在队首元素出列后,将后面的元素依次向前移动,缺点是一旦数据量大的时候需要消耗系统开销,第二种方式是移动front,进行++操作,直到front和rear相等。本文采取第二种方式。
整个完整代码如下,包括其定义和初始化操作。亲测可用~~

#include<Windows.h>
#include<iostream>
#define MAX_SIZE 5
using namespace std;
typedef int datatype;
typedef struct _sqlQueue {
	datatype* data;
	int front;
	int rear;
}sqlQueue;
bool initQueue(sqlQueue*& sq);
bool sqlQueueAppend(sqlQueue*& sq, datatype e);//入列
bool sqlQueueOut(sqlQueue*& sq, datatype& e);//出列
bool sqlQueuePrint(sqlQueue*& sq);
bool sqlQueueClear(sqlQueue*& sq);//清空队列
void sqlQUeueDestroy(sqlQueue*& sq);//销毁队列
int  sqlQueueGetLength(sqlQueue*& sq);//获取队列的长度

int main() {
	sqlQueue* sq=new sqlQueue;
	//01 顺序队列的初始化
	initQueue(sq);//
	//02 添加元素---入队
	cout << "顺序队列添加元素" << endl;
	for (int i = 0; i < 10; i++) {
		if (sqlQueueAppend(sq, i)) {
			cout << "添加元素成功!" << endl;
		}
		else {
			cout << "添加元素失败!" << endl;
		}
	}
	sqlQueuePrint(sq);

	//03-出队 
	datatype e;
	for (int i = 0; i < 10; i++) {
		if(sqlQueueOut(sq, e)) {
			cout << "出列成功!" << e <<endl;
		}
		else {
		    cout << "出列失败!" << endl;
		}
	}
	sqlQueuePrint(sq);
	sqlQueueClear(sq);
	//04 销毁队列
	sqlQUeueDestroy(sq);
	system("pause");
	return 0;
}
bool initQueue(sqlQueue*& sq) {
	sq->data = new datatype[MAX_SIZE];
	if (!sq->data) return true;
	sq->front = sq->rear = 0;
	return true;
}
bool sqlQueueAppend(sqlQueue*& sq, datatype e) {
	if (!sq || sq->rear == MAX_SIZE) return false;
	sq->data[sq->rear] = e;
	sq->rear++;
	return true;
}
bool sqlQueuePrint(sqlQueue*& sq) {
	if (!sq || sq->rear == sq->front) return false;
	for (int i = sq->front; i < sq->rear; i++) {
		cout << sq->data[i] << " ";
	}
	cout << endl;
	return true;
}
bool sqlQueueOut(sqlQueue*& sq, datatype& e) {
	if (!sq || sq->front == sq->rear) return false;
	e = sq->data[sq->front];
	sq->front++;
	return true;
}
bool sqlQueueClear(sqlQueue*& sq) {//清空队列
	if (!sq) return false;
	sq->front = sq->rear = 0;
	return true;
}
void sqlQUeueDestroy(sqlQueue*& sq) {//销毁队列
	if (!sq) return ;	
	delete[] sq->data;
	delete sq;
}
int  sqlQueueGetLength(sqlQueue*& sq) {//获取队列的长度
	if (!sq) return -1;
	return sq->front - sq->rear;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值