目录
前言
1.队列的概念
2.队列的表示和实现
1.定义
1.初始化
2.入队
3.出队
4.获取队头元素
5.判断是否是空队列
6.完整代码
前言
这篇博客主要讲的是对队列的链式存储。
1.队列的概念
队列是一种访问受限的线性表。仅允许在表的一端进行插入操作,在表的另一端进行删除操作。和日常生活中的排队是一致的,最先进入队列的元素最早离开。插入的一端称为队头(front),删除的一端称为队尾(rear)。
队列的示意图如下:
图1.队列的示意图
2.队列的表示和实现
1.定义
我们使用指针我们使用指向结点元素的指针分别表示队列的队头和队尾。
typedef int ElemType;
typedef struct QNode{ElemType data;struct QNode * next;
}QNode,*QueuePtr;typedef struct {QueuePtr front,rear;
}LinkQueue;
1.初始化
链队列的初始化是构造一个只有一个头结点的空队,使队头和队尾指针指向次节点,并将节点的指针置为NULL。如下图2所示。
图2.链队列的操作示意图
队列的初始化代码如下:
//初始化
Status initLinkQueue(LinkQueue *queue) {queue->front = queue->rear = new QNode;if (!queue->front) {return 0; // 内存分配失败}queue->front->next = NULL;return 1;
}
3.入队
入队的过程其实是生成一个新的节点,并且修改尾指针,并且把尾指针设置称为新的节点。
//入队
Status enQueue(LinkQueue *queue, ElemType e) {QueuePtr p = new QNode;if (!p) {return 0; // 内存分配失败}p->data = e;p->next = NULL;queue->rear->next = p;queue->rear = p;return 1;
}
4.出队
连队列的出队首先是判断链队列是否为空,如果为空,则不操作;否则取出表头元素,修改头指针。
//出队
Status deQueue(LinkQueue *queue, ElemType *e) {if (queue->front == queue->rear) {return 0; // 队列为空}QueuePtr p = queue->front->next;*e = p->data;queue->front->next = p->next;if (queue->rear == p) {queue->rear = queue->front; // 如果出队后队列为空,修改队尾指针}delete p;return 1;
}
5.获取队头元素
获取链队列头元素的时候,首先要判断链队列是否是空队列,如果队列为空,不操作;否则,获取队列的头结点的下一个元素即可(因为我们这里用到了头结点,头结点的数据域是不可用使用的)。
//获取队列头元素
Status getHead(LinkQueue *queue, ElemType *e) {if (queue->front == queue->rear) {return 0; // 队列为空}*e = queue->front->next->data;return 1;
}
6.判断是否是空队列
这里当队头和队尾相同的时候,链队列即为空队列。
//判空
Status isEmpty(LinkQueue *queue) {return queue->front == queue->rear;
}
7.完整代码
#include <iostream>
using namespace std;typedef int ElemType;
typedef int Status;
typedef struct QNode {ElemType data;struct QNode *next;
} QNode, *QueuePtr;typedef struct {QueuePtr front, rear;
} LinkQueue;//初始化
Status initLinkQueue(LinkQueue *queue) {queue->front = queue->rear = new QNode;if (!queue->front) {return 0; // 内存分配失败}queue->front->next = NULL;return 1;
}//入队
Status enQueue(LinkQueue *queue, ElemType e) {QueuePtr p = new QNode;if (!p) {return 0; // 内存分配失败}p->data = e;p->next = NULL;queue->rear->next = p;queue->rear = p;return 1;
}//出队
Status deQueue(LinkQueue *queue, ElemType *e) {if (queue->front == queue->rear) {return 0; // 队列为空}QueuePtr p = queue->front->next;*e = p->data;queue->front->next = p->next;if (queue->rear == p) {queue->rear = queue->front; // 如果出队后队列为空,修改队尾指针}delete p;return 1;
}//获取队列头元素
Status getHead(LinkQueue *queue, ElemType *e) {if (queue->front == queue->rear) {return 0; // 队列为空}*e = queue->front->next->data;return 1;
}//判空
Status isEmpty(LinkQueue *queue) {return queue->front == queue->rear;
}int main(int argc, const char * argv[]) {LinkQueue queue;initLinkQueue(&queue);// 入队enQueue(&queue, 1);enQueue(&queue, 2);enQueue(&queue, 3);// 出队并打印ElemType e;while (!isEmpty(&queue)) {deQueue(&queue, &e);cout << e << " ";}cout << endl;return 0;
}