顺序存储的队列遵循先入先出的原则,其结构构成如下:
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;
}