【数据结构】顺序队列与链式队列

devtools/2025/1/22 18:03:04/

顺序队列与链式队列

    • 1.队列的基本概念
    • 1.顺序存储的队列:循环队列
    • 3.链式存储的队列:链式队列

1.队列的基本概念

队列是一种逻辑结构,是一种特殊的线性表

  • 只能在固定的两端操作线性表

只要满足上述条件,那么这种特殊的线性表就会呈现一种“先进先出”的逻辑,这种逻辑就被称为队列。

由于约定了只能在线性表固定的两端进行操作,于是给队列这种特殊的线性表的插入删除,起个特殊的名称:

  • 队头:可以删除节点的一端
  • 队尾:可以插入节点的一端
  • 入队:将节点插入到队尾之后,函数名通常为enQueue()
  • 出队:将队头节点从队列中剔除,函数名通常为outQueue()
  • 取队头:取得队头元素,但不出队,函数名通常为front()

1.顺序存储的队列:循环队列

#include <stdio.h>
#include <stdlib.h>#define QUEUE_SIZE 10typedef struct sq_queue
{int data[QUEUE_SIZE];int tail;
}sq_queue_t;// 
sq_queue_t *sq_queue_init(void)
{sq_queue_t *my_sq_queue = malloc(sizeof(sq_queue_t));(my_sq_queue->tail) = -1;return my_sq_queue;
}// 入队
int en_queue(int new_data, sq_queue_t *sq_queue)
{// 判断队列是否满了if (sq_queue->tail > QUEUE_SIZE - 1){printf("队列已满!\n");return -1;}(sq_queue->tail)++;sq_queue->data[sq_queue->tail] = new_data;return 0;
}// 出队
int out_queue(sq_queue_t *sq_queue)
{int i;if (sq_queue->tail < 0){printf("队列已空!\n");return -1;}int temp = sq_queue->data[0];for (i = 0; i < sq_queue->tail; i++){ sq_queue->data[i] = sq_queue->data[i+1];}(sq_queue->tail)--;return temp;
}int main(int argc, char const *argv[])
{int i;sq_queue_t *my_sq_queue = sq_queue_init();if (!my_sq_queue){printf("[main] init fail\n");return -1;}for (i = 0; i < 12; i++){en_queue(i, my_sq_queue);}for (i = 0; i < 12; i++){printf("出队数据:%d\n", out_queue(my_sq_queue));}return 0;
}

3.链式存储的队列:链式队列

#include <stdio.h>
#include <stdlib.h>typedef struct list_queue
{int data;struct list_queue *tail;struct list_queue *next;
}list_queue_t;// 初始化链式队列, 定义结构体变量
list_queue_t *list_queue_init(void)
{list_queue_t *queue_head = malloc(sizeof(list_queue_t));queue_head->next = NULL;queue_head->tail = queue_head; // 对尾指针指向头节点,每次插入新的节点需要更新队尾指针return queue_head;
}// 入队--尾插
int in_queue(int new_data, list_queue_t *queue)
{list_queue_t *new_node = malloc(sizeof(list_queue_t));// 初始化数据域new_node->data = new_data;new_node->next = NULL;new_node->tail = NULL;// 把新的节点插入到队尾后面queue->tail->next = new_node; // 更新队尾---指向新的节点queue->tail = new_node;return 0;
}// 出队--把头节点的下一个节点删除,返回该节点的数据
int out_queue(list_queue_t *queue)
{// 判断队列是否为空if (!queue->next){printf("队列已空!\n");return -1;}// 定义指针p指向待删除的节点--也就是头节点的下一个节点list_queue_t *p = queue->next;// 备份待删除节点的数据int temp = p->data;// 将头节点的next指针指向待删除节点的下一个节点--删除队首queue->next = p->next;p->next = NULL;free(p);return temp;
}#define IN_QUEUE_NUM 5
int main(int argc, char const *argv[])
{unsigned char i;list_queue_t *head_queue = list_queue_init();for (i = 0; i < IN_QUEUE_NUM; i++){in_queue(i, head_queue);}for (i = 0; i < IN_QUEUE_NUM + 1; i++){printf("出队的数据:%d\n", out_queue(head_queue));}return 0;
}/*
执行结果:出队的数据:0出队的数据:1出队的数据:2出队的数据:3出队的数据:4队列已空!出队的数据:-1*/

http://www.ppmy.cn/devtools/152653.html

相关文章

日本IT|集成测试(結合テスト)的含义

在日本IT行业中&#xff0c;集成测试&#xff08;結合テスト&#xff09;是软件开发过程中的一种重要测试方法。以下是对集成测试的详细解释&#xff1a; 一、定义 集成测试&#xff0c;也被称为集成和测试&#xff08;I&T&#xff09;&#xff0c;是一种软件测试类型。它…

从零开始解决ubuntu2204,pcl-1.8 编译中报错的问题,cmake-gui编译

1.编译pcl时候报错&#xff0c; kdtree is required, but flann not found 2.然后下载了flann&#xff0c;编译flann是报错 按照步骤编译的时候会报错&#xff0c;错误如下&#xff1a; CMake Eroor at src/cpp/CMakeLists.txt:86 (add_library): No SOURCES given to target…

uni-app vue3 常用页面 组合式api方式

全局api请求封装 utils/request.js import config from /utils/config; // 统一 POST 请求方法示例 const post (url, data, options {}) > {url config.url url;console.log("uni.getStorageSync(token)", uni.getStorageSync(token));const defaultOptions…

ROS2测试仿真

电脑配置&#xff1a;R7-7840H 核显 结论&#xff1a;turtlebot3 运行失败。 turtlebot4 可以进入仿真环境&#xff0c;但是无法操作。 现在在用 ign gazebo 驱动简单的差分机器人 ign gazebo 采用ign gazebo 打开简单的差分机器人 安装 sudo apt-get install ros-${ROS_DI…

【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块

【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块 在本篇文章中&#xff0c;我们将一步步走过如何创建一个简单的 HarmonyOS NAPI 模块。通过这个模块&#xff0c;你将能够更好地理解 NAPI 的工作原理&#xff0c;并在你的应用中开始使用 C 与 JavaScript 的…

Elixir语言的语法

Elixir 语言简介与实践 1. 引言 在现代软件开发中&#xff0c;选择合适的编程语言对于项目的成功至关重要。Elixir作为一种功能强大的并发编程语言&#xff0c;近年来逐渐走入开发者的视野。本文将通过Elixir的基本语法、特性和实践案例&#xff0c;帮助读者深入了解这种语言…

MySQL篇之对MySQL进行参数优化,提高MySQL性能

1. MySQL参数优化说明 MySQL 参数调优是提高数据库性能的重要手段之一。通过调整 MySQL 的配置参数&#xff0c;可以优化查询速度、提升并发处理能力、减少资源消耗等。 MySQL 的性能优化涉及到多个方面&#xff0c;包括内存管理、磁盘 I/O、查询优化、连接管理、复制配置等。…

2.6 聚焦:Word Embedding

聚焦:Word Embedding Word Embedding(词嵌入) 是一种将词语转化为低维向量表示的技术,使得词语在数学空间中具有语义上的相似性。它是自然语言处理(NLP)中不可或缺的一部分,为文本数据提供了强大的表示能力。与传统的基于词频的词袋模型(Bag-of-Words)相比,Word Emb…