### 数据结构:队列实现详解 #### 一、队列概念与特性 在计算机科学领域,**队列**是一种常见的线性数据结构,遵循先进先出(First In First Out, FIFO)的原则。也就是说,最早添加到队列中的元素将是最先被移除的元素。队列通常用于解决需要按顺序处理数据的问题,比如任务调度、缓冲管理等场景。 #### 二、队列的基本操作 队列支持一系列基本的操作: 1. **初始化队列**:创建一个空队列。 2. **入队操作**:在队列的尾部添加一个新的元素。 3. **出队操作**:从队列的头部移除并返回一个元素。 4. **获取队首元素**:查看队列前端的元素而不将其移除。 5. **判断队列是否为空**:检查队列当前是否没有任何元素。 6. **清空队列**:移除队列中的所有元素。 #### 三、队列的实现方式 队列可以通过多种方式进行实现,包括数组和链表。这里主要讨论基于链表的队列实现,因为它提供了更加灵活的操作方式。 #### 四、链表实现队列的示例代码分析 下面通过具体的代码实现来详细解释如何使用链表来实现队列。 ```c struct sNode { elemType data; // 存储数据值 struct sNode *next; // 指向下一个节点的指针 }; struct queueLK { struct sNode *front; // 队列的头部指针 struct sNode *rear; // 队列的尾部指针 }; ``` 1. **初始化队列**: ```c void initQueue(struct queueLK *hq) { hq->front = hq->rear = NULL; // 将头部和尾部指针均置为NULL return; } ``` 初始化队列时,需要将队列的头部和尾部指针都设置为`NULL`,表示队列为空。 2. **入队操作**: ```c void enQueue(struct queueLK *hq, elemType x) { struct sNode *newP; newP = malloc(sizeof(struct sNode)); if (newP == NULL) { printf("在内存分配失败"); exit(1); } newP->data = x; newP->next = NULL; if (hq->rear == NULL) { // 如果队列为空 hq->front = hq->rear = newP; } else { // 如果队列非空 hq->rear->next = newP; hq->rear = newP; } return; } ``` 入队操作涉及到动态内存分配,因此需要检查分配是否成功。如果队列为空,则新节点同时作为头尾节点;如果队列非空,则将新节点添加到队尾,并更新尾部指针。 3. **出队操作**: ```c elemType outQueue(struct queueLK *hq) { struct sNode *p; elemType temp; if (hq->front == NULL) { printf("队列为空,无法删除"); exit(1); } temp = hq->front->data; p = hq->front; hq->front = p->next; if (hq->front == NULL) { // 如果队列变为空 hq->rear = NULL; } free(p); return temp; } ``` 出队操作需要释放被移除节点的内存,并确保队列头部指针正确指向新的队首节点。 4. **获取队首元素**: ```c elemType peekQueue(struct queueLK *hq) { if (hq->front == NULL) { printf("队列为空,无法获取"); exit(1); } return hq->front->data; } ``` 此操作仅返回队首元素,不改变队列的状态。 5. **判断队列是否为空**: ```c int emptyQueue(struct queueLK *hq) { if (hq->front == NULL) { return 1; } else { return 0; } } ``` 通过检查队列头部指针是否为`NULL`来判断队列是否为空。 6. **清空队列**: ```c void clearQueue(struct queueLK *hq) { struct sNode *p = hq->front; while (p != NULL) { hq->front = hq->front->next; free(p); p = hq->front; } hq->rear = NULL; return; } ``` 清空队列时需要遍历整个队列并释放每个节点的内存。 #### 五、主函数示例 我们通过一个简单的示例来看看如何使用这个队列: ```c int main() { struct queueLK q; int a[8] = {3, 8, 5, 17, 9, 30, 15, 22}; int i; initQueue(&q); for (i = 0; i < 8; i++) { enQueue(&q, a[i]); } printf("%d\n", outQueue(&q)); // 输出第一个入队的元素 printf("%d\n", outQueue(&q)); // 输出第二个入队的元素 enQueue(&q, 68); // 再次入队一个元素 printf("%d\n", peekQueue(&q)); // 查看队首元素 printf("%d\n", outQueue(&q)); // 移除队首元素 while (!emptyQueue(&q)) { printf("%d ", outQueue(&q)); // 依次移除队列中的所有元素 } printf("\n"); clearQueue(&q); // 清空队列 return 0; } ``` 通过以上步骤,我们可以清楚地看到队列的各种操作是如何实现的,这有助于深入理解和掌握队列这种数据结构。
#include <stdlib.h>
typedef int elemType;
/************************************************************************/
/* 以下是关于队列链接存储操作的6种算法 */
/************************************************************************/
struct sNode{
elemType data; /* 值域 */
struct sNode *next; /* 链接指针 */
};
struct queueLK{
struct sNode *front; /* 队首指针 */
struct sNode *rear; /* 队尾指针 */
};
/* 1.初始化链队 */
void initQueue(struct queueLK *hq)
{
hq->front = hq->rear = NULL; /* 把队首和队尾指针置空 */
return;
}
/* 2.向链队中插入一个元素x */
void enQueue(struct queueLK *hq, elemType x)
{
/* 得到一个由newP指针所指向的新结点 */
struct sNode *newP;
newP = malloc(sizeof(struct sNode));
if(newP == NULL){
printf("内存空间分配失败! ");
exit(1);
}
newP->data = x;
newP->next = NULL;
/* 若链队为空,则新结点即是队首结点又是队尾结点 */
if(hq->rear == NULL){
hq->front = hq->rear = newP;
}else{ /* 若链队非空,则依次修改队尾结点的指针域和队尾指针,使之指向新的队尾结点 */
hq->rear = hq->rear->next = newP; /* 注意赋值顺序哦 */
}
return;
}
/* 3.从队列中删除一个元素 */
elemType outQueue(struct queueLK *hq)
{
struct sNode *p;
elemType temp;
/* 若链队为空则停止运行 */
if(hq->front == NULL){
printf("队列为空,无法删除! ");
exit(1);
}
temp = hq->front->data; /* 暂存队尾元素以便返回 */
p = hq->front; /* 暂存队尾指针以便回收队尾结点 */
hq->front = p->next; /* 使队首指针指向下一个结点 */
/* 若删除后链队为空,则需同时使队尾指针为空 */
if(hq->front == NULL){
hq->rear = NULL;
}
free(p); /* 回收原队首结点 */
return temp; /* 返回被删除的队首元素值 */
剩余7页未读,继续阅读
- 粉丝: 1
- 资源: 7
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- tomcat6.0配置oracle数据库连接池中文WORD版最新版本
- hibernate连接oracle数据库中文WORD版最新版本
- MyEclipse连接MySQL的方法中文WORD版最新版本
- MyEclipse中配置Hibernate连接Oracle中文WORD版最新版本
- MyEclipseTomcatMySQL的环境搭建中文WORD版3.37MB最新版本
- hggm - 国密算法 SM2 SM3 SM4 SM9 ZUC Python实现完整代码-算法实现资源
- SQLITE操作入门中文WORD版最新版本
- Sqlite操作实例中文WORD版最新版本
- SQLITE特性分析中文WORD版最新版本
- ORACLE创建表空间中文WORD版最新版本