当前位置: 首页 > news >正文

数据结构之队列,哈希表

一 队列(先进先出)

1.定义:从一端进行数据插入,另一端进行删除的线性存储结构

队列类型 

 

常见操作

- 入队(Enqueue):将新元素添加到队列的尾部。若队列有空间,新元素会成为队列的新尾部元素;若队列已满,可能会触发队列已满的处理机制。

- 出队(Dequeue):从队列的头部移除元素。执行后,原队头元素被删除,原队头的下一个元素成为新队头。若队列为空,可能会触发队列空的处理机制。

- 获取队头元素(Front):返回队列头部的元素,但不删除它,以便查看即将被处理的元素。

- 判断队列是否为空(IsEmpty):检查队列中是否有元素,若没有则返回真,否则返回假。

- 获取队列大小(Size):返回队列中元素的数量。

Queue *create_queue()                  //创建队列
{Queue *pque = malloc(sizeof(Queue));if (NULL == pque){printf("fail malloc\n");return NULL;}pque->pfront = NULL;pque->ptail = NULL;pque->clen = 0;return pque;}
int enter_queue(Queue *pque, Data_type data)        //入队
{Que_node *pnode = malloc(sizeof(Que_node));	if (NULL == pnode){printf("fail malloc\n");return -1;}pnode->data = data;pnode->pnext = NULL;if (is_empty_queue(pque)){pque->ptail = pnode;pque->pfront = pnode;}else{pque->ptail->pnext = pnode;pque->ptail = pnode;}pque->clen++;return 0;
}
/***************************返回值:返回出队的元素个数*   为空:0*   成功:1* ************************/
int out_queue(Queue *pque, Data_type *pdata)       //出队
{if (is_empty_queue(pque)){return 0;}if (pdata != NULL){*pdata = pque->pfront->data;}Que_node *pdel = pque->pfront;pque->pfront = pdel->pnext;free(pdel);if (NULL == pque->pfront){pque->ptail = NULL;}pque->clen--;return 1;
}
int is_empty_queue(Queue *pque)         //判断是否为空
{return NULL == pque->pfront;
}
void clear_queue(Queue *pque)          //清空队列
{while (!is_empty_queue(pque)){out_queue(pque, NULL);}
}
void destroy_queue(Queue **ppque)        //销毁队列
{clear_queue(*ppque);free(*ppque);*ppque = NULL;
}
void queue_for_each(Queue *pque)        //遍历队列
{Que_node *p = pque->pfront;while (p != NULL){printf("%d ", p->data);p = p->pnext;}printf("\n");
}
int get_front_queue(Queue *pque, Data_type *pdata)     //获取队头数据
{if (is_empty_queue(pque)){return 0;}if (pdata != NULL){*pdata = pque->pfront->data;}return 1;
}

二 队列与栈的区别

队列和栈都是常见的数据结构,它们既有区别又有联系,具体如下:

区别

- 操作规则:队列遵循先进先出(FIFO)原则,如排队买票,先到的人先买。在队列中,新元素从队尾进入,从队头出。栈遵循后进先出(LIFO)原则,像堆叠盘子,后放的先取。在栈中,元素从栈顶进,也从栈顶出。

- 操作位置:队列的插入操作在队尾,删除操作在队头。栈的插入和删除操作都在栈顶。

- 应用场景:队列常用于任务排队、消息传递等场景,如打印机任务队列。栈常用于函数调用、表达式求值、括号匹配等,如计算表达式时用栈存储操作数和运算符。

- 数据访问方式:队列通常只能访问队头和队尾元素。栈只能访问栈顶元素。

联系

- 数据结构类型:队列和栈都是线性数据结构,数据元素间呈线性关系,一个接一个排列,有前驱和后继(除首尾元素)。

- 基本操作:都有插入和删除数据的操作,尽管操作规则和位置不同,但都是对数据的基本增删操作。

- 存储实现:都可以用数组或链表实现。用数组实现时,都要考虑边界条件和空间大小;用链表实现时,都要操作节点的指针来实现数据的插入和删除。

三 哈希存储(散列存储)

哈希存储是一种重要的数据存储和检索技术,以下是相关介绍:

基本概念:

哈希存储,也叫散列存储,是根据关键码值(key)直接访问数据的存储结构。它通过一个哈希函数,把关键码值映射到一个有限的、连续的地址空间,这个地址空间称为哈希表或散列表。哈希函数的作用是将任意长度的输入数据,转换为固定长度的输出,这个输出就是数据在哈希表中的存储位置,也叫哈希值或散列值。

关键特点

- 快速查找:理想情况下,哈希存储能在接近常数的时间复杂度内完成查找、插入和删除操作,效率极高。

- 无需数据有序:数据在哈希表中的存储位置与数据本身的大小、顺序等无关,只取决于哈希函数和关键码值。

- 存储空间相对固定:哈希表的大小通常在创建时就确定或有一定的扩展策略,不随数据量的增加而无限增长。

哈希函数的设计原则

- 一致性:相同的输入必须产生相同的输出。

- 高效性:计算哈希值的过程应尽量简单快速,以减少时间开销。

- 均匀性:理想情况下,哈希函数应将不同的关键码值均匀地分布在哈希表的地址空间中,减少冲突的发生。

处理冲突的方法

- 开放定址法:当冲突发生时,通过某种探测序列在哈希表中寻找下一个可用的空闲位置来存储数据。比如线性探测法,就是依次检查下一个位置,直到找到空闲位置。

- 链地址法:将所有哈希值相同的数据存储在一个链表中,哈希表中的每个位置指向一个链表,链表中的节点存储具有相同哈希值的数据。

应用场景

- 数据库索引:数据库系统常使用哈希索引来快速定位数据记录,提高数据查询效率。

- 缓存系统:在缓存中,哈希存储用于快速查找缓存数据,判断数据是否已在缓存中,提高数据访问性能。

API接口实现

int hash_function(char key)
{if (key >= 'a' && key <= 'z'){return key - 'a';}else if (key >= 'A' && key <= 'Z'){return key - 'A';}else{return HASH_TABLE_MAX_SIZE-1;}
}int insert_hash_table(Hash_node **hash_table, Data_type data)
{int addr = hash_function(data.name[0]);	Hash_node *pnode = malloc(sizeof(Hash_node));if (NULL == pnode){printf("fail malloc\n");return -1;}pnode->data = data;pnode->pnext = NULL;
/*pnode->pnext = hash_table[addr]; //pheadhash_table[addr] = pnode;
*/if (NULL == hash_table[addr]){hash_table[addr] = pnode;}else if (strcmp(hash_table[addr]->data.name, data.name) >= 0){pnode->pnext = hash_table[addr];hash_table[addr] = pnode;}else{Hash_node *p = hash_table[addr];while (p->pnext != NULL && strcmp(p->pnext->data.name, pnode->data.name) < 0){p = p->pnext;}pnode->pnext = p->pnext;p->pnext = pnode;}return 0;
}void hash_table_for_each(Hash_node **hash_table)
{for (int i = 0; i < HASH_TABLE_MAX_SIZE; i++){Hash_node *p = hash_table[i];while (p != NULL){printf("%s: %s\n", p->data.name, p->data.tel);p = p->pnext;}printf("\n");}
}Hash_node *find_hash_by_name(Hash_node **hash_table, char *name)
{int addr = hash_function(name[0]);Hash_node *p = hash_table[addr];while (p){if (0 == strcmp(p->data.name, name)){return p;}p = p->pnext;}return NULL;
}void destroy_hash_table(Hash_node **hash_table)
{for (int i = 0; i < HASH_TABLE_MAX_SIZE; i++){Hash_node *p = hash_table[i];while (p != NULL){hash_table[i] = p->pnext;free(p);p = hash_table[i];}}
}

相关文章:

数据结构之队列,哈希表

一 队列(先进先出) 1.定义&#xff1a;从一端进行数据插入&#xff0c;另一端进行删除的线性存储结构 队列类型 常见操作 - 入队&#xff08;Enqueue&#xff09;&#xff1a;将新元素添加到队列的尾部。若队列有空间&#xff0c;新元素会成为队列的新尾部元素&#xff1b;若…...

讯方·智汇云校华为授权培训机构的介绍

官方授权 华为授权培训服务伙伴&#xff08;Huawei Authorized Learning Partner&#xff0c;简称HALP&#xff09;是获得华为授权&#xff0c;面向公众&#xff08;主要为华为企业业务的伙伴/客户&#xff09;提供与华为产品和技术相关的培训服务&#xff0c;培养华为产业链所…...

【16届蓝桥杯寒假刷题营】第1期DAY4

1.披萨和西蓝花 - 蓝桥云课 1. 披萨和西蓝花 问题描述 在接下来的 N 天里&#xff08;编号从 1 到 N&#xff09;&#xff0c;坤坤计划烹饪披萨或西兰花。他写下一个长度为 N 的字符串 A&#xff0c;对于每个有效的 i&#xff0c;如果字符 Ai 是 1&#xff0c;那么他将在第 i…...

【Linux】cron计划任务定时执行命令

在Linux系统中&#xff0c;crontab 是一种用于设置周期性执行任务的工具&#xff0c;通过编辑 crontab 文件&#xff0c;用户可以指定在特定时间自动运行命令或脚本。以下是关于 crontab 的详细介绍&#xff1a; 1. crontab 基本结构 每个 crontab 任务由一行配置组成&#xf…...

rdian是一个结构体,pdian=^Rdian,list泛型做什么用?

不明白不让编译的原因&#xff0c;记录下之遇到注意原油。 var mylist:TList<string>; mylist1:TList<Pdian>; mydian:Pdian; i:Integer; mylist2:TList<Rdian>; mydian2:rdian; arr:array of Rdian; begin mylist:TList…...

【05】RUST错误处理

文章目录 错误处理panic代码运行ResutResult中的一些方法介绍传播错误`?`运算符错误处理 建议是尽量用Result由调用者自行决定是否恢复,不恢复也可直接在Err中调用panic。代码分支不可能走的分支可panic。 需要panic的情况: 有害状态:当一些假设、保证、协议或不可变性被打…...

WinForm 防破解、反编译设计文档

一、引言 1.1 文档目的 本设计文档旨在阐述 WinForm 应用程序防破解、反编译的设计方案&#xff0c;为开发团队提供详细的技术指导&#xff0c;确保软件的知识产权和商业利益得到有效保护。 1.2 背景 随着软件行业的发展&#xff0c;软件破解和反编译现象日益严重。WinForm…...

1 推荐系统概述

推荐系统概述 1 推荐系统的意义平台方信息生产者&#xff08;物品&#xff09;信息消费者&#xff08;用户&#xff09;推荐和搜索的区别 2 推荐系统架构系统架构算法架构 3 推荐系统技术栈算法画像层召回/粗排精排重排序 工程 1 推荐系统的意义 信息生产者&#xff08;平台方…...

Redis初阶笔记

1. 认识Redis Redis是一个基于内存运行的缓存中间件&#xff0c;有着多种的数据类型可供使用。Redis的使用主要是为关系性数据库&#xff08;MySQL等&#xff09;分担压力&#xff0c;在高并发环境下MySQL执行命令的压力是很大的&#xff0c;容易宕机&#xff0c;所以需要中间件…...

electron.vite 项目创建以及better-sqlite3数据库使用

1.安装electron.vite npm create quick-start/electronlatest中文官网&#xff1a;https://cn.electron-vite.org/ 2. 安装项目依赖 npm i3.修改 electron-builder 配置文件 appId: com.electron.app productName: text33 directories:buildResources: build files:- !**/.v…...

【新品解读】AI 应用场景全覆盖!解码超高端 VU+ FPGA 开发平台 AXVU13F

「AXVU13F」Virtex UltraScale XCVU13P Jetson Orin NX 继发布 AMD Virtex UltraScale FPGA PCIE3.0 开发平台 AXVU13P 后&#xff0c;ALINX 进一步研究尖端应用市场&#xff0c;面向 AI 场景进行优化设计&#xff0c;推出 AXVU13F。 AXVU13F 和 AXVU13P 采用相同的 AMD Vir…...

Proxmox VE 8.3 qm 方式导入ESXi Linux OVA UEFI模式虚拟机

前言 实现esxi ova uefi 虚拟机导入到pve,Linux UEFI 都支持 创建一个105虚拟机 qm 参数使用参考,以下可以根据自己的实际情况执行调整 esxi 导出虚拟机参考 #vmid (100 - 999999999) vmid=105# qm vm name...

OpenAI 放王炸,将发布整合多项技术的 GPT-5,并免费无限使用,该模型有哪些技术亮点

对于 ChatGPT 的免费用户&#xff0c;将可以无限制地访问 GPT-5&#xff0c;但仅限于标准的智能级别。该级别会设定滥用限制&#xff0c;以防止不当使用(意思就是你得付费嘛)。 OpenAI CEO Sam Altman 今天在 X 上透露了 GPT-4.5 和 GPT-5 的最新发展计划。 OpenAI 将发布代…...

【前端框架与库】「深入理解 Vue 插槽」:类型、用法与实际场景解析,增强组件复用性的利器

深入理解 Vue 插槽 [TOC](深入理解 Vue 插槽) 前言一、插槽的几种类型1. 默认插槽&#xff08;Default Slot&#xff09;2. 具名插槽&#xff08;Named Slot&#xff09;3. 作用域插槽&#xff08;Scoped Slot&#xff09; 二、插槽的作用与实际使用场景三、延伸知识总结 前言 …...

对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 与基于 openEuler 构建 LVS-DR 群集

一、 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式&#xff0c;比较其各自的优势 NAT 模式 部署简单&#xff1a;NAT 模式下&#xff0c;所有的服务器节点只需要连接到同一个局域网内&#xff0c;通过负载均衡器进行网络地址转换&#xff0c;就可以实现负载均衡功能。不需要对…...

matplotlib绘制频率分布直方图

1.给了数据,让统计这些数据的分布 from matplotlib import pyplot as plt from matplotlib import rcParams import random as r# 直方图用来统计每个区间数量多少rcParams[font.sans-serif] [SimHei] rcParams[axes.unicode_minus] Falseplt.figure(figsize(20,8), dpi80)#…...

相得益彰,Mendix AI connector 秒连DeepSeek ,实现研发制造域场景

在当今快速发展的科技领域&#xff0c;低代码一体化平台已成为企业数字化转型的关键工具&#xff0c;同时&#xff0c;大型语言模型&#xff08;LLM&#xff09;如 DeepSeek 在自动生成代码和提供智能建议方面表现出色。 Mendix 于近期发布的 GenAI 万能连接器&#xff0c;目前…...

shell脚本自动安装MySQL8

环境&#xff1a;centos7版本&#xff1a;8.0.28安装包&#xff1a;mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz 二进制包要求&#xff1a;安装包和shell脚本在同一目录下执行方式&#xff1a;sudo ./install_mysql8.sh #!/bin/bash# 定义MySQL安装目录和压缩包名称MYSQL_DIR…...

Git | 相关命令

相关资料 官网Git 学习教程Git 入门指南Git 的奇技淫巧Git Extras git 命令行扩展工具配置 Git 处理行结束符Git 配置多个 SSH-Key下载相关 Windows 版下载镜像使用 jsdelivr 加速 Github 仓库资源 commit 常用的 type 常用 Git 命令 [xxx] 均为可选参数 git clone # 拷贝一…...

RealClip正式发布:重新定义轻量化数字内容交互体验

在移动互联网流量红利逐渐见顶的当下&#xff0c;用户对即时性、碎片化娱乐与交互体验的需求持续攀升。轻量化小游戏、VR互动、数字孪生、工业仿真等内容形态迅速崛起&#xff0c;但开发者却面临两大核心矛盾&#xff1a;如何将高性能互动内容轻量化嵌入现有应用中&#xff1f;…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系&#xff0c;可直观判断线性相关、非线性相关或无相关关系&#xff0c;点的分布密…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程

基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...