队列是一种受限的线性表,(Queue),它是一种运算受限的线性表,先进先出(FIFO First In First Out)。
它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
顺序存储
定义结构
#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;
}
入队
bool enterQueue(SeqQueue* SQ, DataType val) {
if (!SQ) return false;
if (isFull(SQ)) {
cout << "Queue is full, can't enter !" << endl;
return false;
}
SQ->queue[SQ->rear] = val;
SQ->rear++;
return true;
}
出队
bool outQueue(SeqQueue* SQ, DataType& val) {
if (!SQ || isEmpty(SQ)) {
cout << "Queue is empty" << endl;
return false;
}
val = SQ->queue[SQ->front];
for (int i = SQ->front + 1; i < SQ->rear; i++) {
SQ->queue[i - 1] = SQ->queue[i];
}
SQ->rear--;
return true;
}
bool outQueue2(SeqQueue* SQ, DataType& val) {
if (!SQ || isEmpty(SQ)) {
cout << "Queue is empty" << endl;
return false;
}
if (SQ->front >= MaxSize) {
cout << "Qqueue is out of range" << endl;
return false;
}
val = SQ->queue[SQ->front];
SQ->front++;
return true;
}
输出队
void printQueue(SeqQueue* SQ) {
if (!SQ) return;
int i = SQ->front;
for (; i < SQ->rear; i++) {
cout << setw(4) << SQ->queue[i];
}
cout << endl;
}
获取首元素
int getHead(SeqQueue* SQ) {
if (!SQ || isEmpty(SQ)) {
cout << "Queue is empty" << endl;
return;
}
return 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() {
SeqQueue* SQ = new SeqQueue;
DataType data = -1;
//初始化队列
initQueue(SQ);
//入队
for (int i = 0; i < 7; i++) {
enterQueue(SQ, i);
}
//打印队列中的元素
printf("队列中的元素(总共%d 个):", getLength(SQ));
printQueue(SQ);
cout << endl;
//出队
if (outQueue2(SQ, data)) {
cout << "出队的元素是:" << data << endl;
}
else {
cout << "出队失败!" << endl;
}
//打印队列中的元素
printf("出队一个元素后,队列中剩下的元素:");
printQueue(SQ);
cout << endl;
return 0;
}
链式存储
结构定义
#define MaxSise 5
typedef int DataType;
typedef struct _QNode {
DataType data;
struct _QNode* next;
}QNode;
typedef QNode* QNodePtr;
typedef struct Queue {
int length;
QNodePtr front;
QNodePtr rear;
}LinkQueue;
初始化
void initQueue(LinkQueue* LQ) {
if (!LQ) return;
LQ->length = 0;
LQ->front = LQ->rear = NULL;
}
判断队空或队满
bool isEmpty(LinkQueue* LQ) {
if (!LQ) return false;
return LQ->front == NULL;
}
bool isFull(LinkQueue* LQ) {
if (!LQ) return false;
return LQ->length == MaxSise;
}
入队
bool enterQueue(LinkQueue* LQ, DataType data) {
if (!LQ || isFull(LQ)) {
cout << "Queue is full, can't enter !" << endl;
return false;
}
QNode* qNode = new QNode;
qNode->data = data;
qNode->next = NULL;
if (isEmpty(LQ)) {
LQ->front = LQ->rear = qNode;
}
else {
LQ->rear->next = qNode;
LQ->rear = qNode;
}
LQ->length++;
return true;
}
出队
bool outQueue(LinkQueue* LQ, DataType& data) {
if (!LQ || isEmpty(LQ)) {
cout << "Queue is empty !" << endl;
return false;
}
QNode* tmp = LQ->front;
data = tmp->data;
LQ->front = tmp->next;
if (!(LQ->front)) LQ->rear = NULL;//如果对头出列后不存在其他元素,则rear节点也要置空
LQ->length--;
delete tmp;
return true;
}
输出队
void printQueue(LinkQueue* LQ) {
if (!LQ) return;
if (isEmpty(LQ)) {
cout << "Queue is empty !" << endl;
return;
}
QNodePtr tmp;
tmp = LQ->front;
while (tmp) {
cout << setw(4) << tmp->data;
tmp = tmp->next;
}
cout << endl;
}
获取首元素
void getHead(LinkQueue* LQ,DataType &data) {
if (!LQ || isEmpty(LQ)) {
cout << "Queue is empty !" << endl;
return;
}
data = LQ->front->data;
}
清空队列
void clearQueue(LinkQueue* LQ) {
if (!LQ) return;
QNodePtr tmp;
while (LQ->front) {
tmp = LQ->front->next;
delete LQ->front;
LQ->front = tmp;
}
LQ->front = LQ->rear = NULL;
LQ->length = 0;
}
队列长度
int getLength(LinkQueue* LQ) {
if (!LQ) return 0;
return LQ->length;
}
测试
int main() {
LinkQueue* LQ = new LinkQueue;
DataType data = -1;
//初始化队列
initQueue(LQ);
//入队
for (int i = 0; i < 7; i++) {
enterQueue(LQ, i);
}
//打印队列中的元素
printf("队列中的元素(总共%d 个):", getLength(LQ));
printQueue(LQ);
cout << endl;
//出队
if (outQueue(LQ, data)) {
cout << "出队的元素是:" << data << endl;
}
else {
cout << "出队失败!" << endl;
}
//打印队列中的元素
printf("出队一个元素后,队列中剩下的元素[%d]:", getLength(LQ));
printQueue(LQ);
cout << endl;
clearQueue(LQ);
cout << "清空队列!\n";
printQueue(LQ);
//清理资源
delete LQ;
return 0;
}
循环队列
结构定义
#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;
}
判断队空或队满
bool isEmpty(SeqQueue* SQ) {
if (!SQ) return false;
return SQ->front == SQ->rear;
}
bool isFull(SeqQueue* SQ) {
if (!SQ) return false;
return ((SQ->rear + 1) % MaxSize) == SQ->front;
}
入队
bool enterQueue(SeqQueue* SQ, DataType data) {
if (!SQ) return false;
if (isFull(SQ)) {
cout << "Queue is out!" << endl;
return false;
}
SQ->queue[SQ->rear] = data;
SQ->rear = (SQ->rear + 1) % MaxSize;
return true;
}
出队
bool outQueue(SeqQueue* SQ, DataType& data) {
if (!SQ || isEmpty(SQ)) {
cout << "Queue is empty" << endl;
return false;
}
data = SQ->queue[SQ->front];
SQ->front = (SQ->front + 1) % MaxSize;
return true;
}
输出队
void printQueue(SeqQueue* SQ) {
if (!SQ) return;
int i = SQ->front;
while (i != SQ->rear) {
cout << setw(4) << SQ->queue[i];
i = (i + 1) % MaxSize;
}
cout << endl;
}
获取首元素
int getHead(SeqQueue* SQ, DataType* data) {
if (!SQ || isEmpty(SQ)) {
cout << "队列为空!" << endl;
}
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 + MaxSize) % MaxSize;
}
测试
int main() {
SeqQueue* SQ = new SeqQueue;
DataType data = -1;
//初始化队列
initQueue(SQ);
//入队
for (int i = 0; i < 7; i++) {
enterQueue(SQ, i);
}
//打印队列中的元素
printf("队列中的元素(总共%d 个):", getLength(SQ));
printQueue(SQ);
cout << endl;
for (int i = 0; i < 5; i++) {
if (outQueue(SQ, data)) {
cout << "出队的元素是:" << data << endl;
}
else {
cout << "出队失败!" << endl;
}
}
printf("出队五个元素后,队列中剩下的元素个数为 %d 个:", getLength(SQ));
printQueue(SQ);
cout << endl;
//入队 4 个
for (int i = 0; i < 4; i++) {
enterQueue(SQ, i + 10);
}
printf("\n 入队四个元素后,队列中剩下的元素个数为 %d 个:",
getLength(SQ));
printQueue(SQ);
return 0;
}
优先队列
结构定义
#define MaxSize 5
typedef int DataType;
typedef struct _QNode {
int priority;
DataType data;
struct _QNode* next;
}QNode;
typedef QNode* QueuePtr;
typedef struct Queue {
int length;
QueuePtr front;
QueuePtr rear;
}LinkQueue;
初始化
void initQueue(LinkQueue* LQ) {
if (!LQ) return;
LQ->front = LQ->rear = NULL;
LQ->length = 0;
}
判断队空或队满
bool isEmpty(LinkQueue* LQ) {
if (!LQ) return false;
return LQ->front == NULL;
}
bool isFull(LinkQueue* LQ) {
if (!LQ) return false;
return LQ->length == MaxSize;
}
入队
bool enterQueue(LinkQueue* LQ,DataType data,int priority) {
if (!LQ) return false;
if (isFull(LQ)) {
cout << "Queue is full !" << endl;
return false;
}
QueuePtr qNode = new QNode;
qNode->data = data;
qNode->priority = priority;
qNode->next = NULL;
if (isEmpty(LQ)) {
LQ->front = LQ->rear = qNode;
}
else {
LQ->rear->next = qNode;
LQ->rear = qNode;
}
LQ->length++;
return true;
}
出队
bool outQueue(LinkQueue* LQ, DataType* data) {
QNode** prev = NULL, * prev_node = NULL;
QueuePtr last = NULL, tmp = NULL;
if (isEmpty(LQ)) {
cout << "Queue is empty !" << endl;
return false;
}
prev = &(LQ->front);
printf("第一个节点的优先级是:%d\n", (*prev)->priority);
last = LQ->front;
tmp = last->next;
while (tmp) {
if (tmp->priority > (*prev)->priority) {
printf("抓到更大优先级的节点[priority: %d]\n", tmp->priority);
prev = &(last->next);
prev_node = last;
}
last = tmp;
tmp = tmp->next;
}
*data = (*prev)->data;
tmp = *prev;
*prev = (*prev)->next;
delete tmp;
LQ->length--;
//1.删除的是首节点,而且队列长度为零
if (LQ->length == 0) {
LQ->rear = NULL;
}
//2.删除的是尾部节点
if (prev_node && prev_node->next == NULL) {
LQ->rear = prev_node;
}
return true;
}
输出队
void printQueue(LinkQueue* LQ) {
if (!LQ || LQ->front == NULL) {
cout << "Queue is empty !" << endl;
return;
}
QueuePtr tmp;
tmp = LQ->front;
while (tmp) {
cout << setw(4) << tmp->data << "[" << tmp->priority << "]";
tmp = tmp->next;
}
cout << endl;
}
获取首元素
DataType getHead(LinkQueue* LQ, DataType& data) {
if (!LQ || isEmpty(LQ)) {
cout << "Queue is empty !" << endl;
return 0;
}
return data = LQ->front->data;
}
清空队列
void clearQueue(LinkQueue* LQ) {
if (!LQ) return;
while (LQ->front) {
QueuePtr tmp = LQ->front->next;
delete LQ->front;
LQ->front = tmp;
}
LQ->front = LQ->rear = NULL;
LQ->length = 0;
}
队列长度
int getLength(LinkQueue* LQ) {
if (!LQ) return -1;
return LQ->length;
}
测试
int main() {
LinkQueue* LQ = new LinkQueue;
DataType data = -1;
//初始化队列
initQueue(LQ);
//入队
for (int i = 0; i < 5; i++) {
enterQueue(LQ, i + 10, i);
}
//打印队列中的元素
printf("队列中的元素(总共%d 个):", getLength(LQ));
printQueue(LQ);
cout << endl;
//出队
for (int i = 0; i < 5; i++) {
if (outQueue(LQ, &data)) {
cout << "出队的元素是:" << data << endl;
}
else {
cout << "出队失败!" << endl;
}
}
//打印队列中的元素
printf("出队五个元素后,队列中剩下的元素[%d]:\n", getLength(LQ));
printQueue(LQ);
cout << endl;
clearQueue(LQ);
cout << "清空队列!\n";
printQueue(LQ);
delete LQ;
return 0;
}