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

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

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;
}

发布了51 篇原创文章 · 获赞 0 · 访问量 525

猜你喜欢

转载自blog.csdn.net/weixin_40071289/article/details/104023400