当前位置: 首页 > 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;…...

开源金属四足机器人MEVIUS2设计与实现解析

1. MEVIUS2&#xff1a;开源金属四足机器人设计解析四足机器人技术近年来取得了显著进展&#xff0c;从实验室走向了实际应用场景。作为一名长期从事机器人系统开发的工程师&#xff0c;我特别关注如何降低这类先进机器人的研发门槛。MEVIUS2项目正是这一领域的突破性尝试——它…...

GaN功率器件表征实战:从SOA曲线到动态测试与可靠性评估

1. 项目概述&#xff1a;为什么我们需要重新审视GaN功率器件的表征&#xff1f;如果你最近在设计开关电源、电机驱动或者任何需要高效能量转换的电路&#xff0c;大概率已经听过氮化镓&#xff08;GaN&#xff09;这个名字。它不再只是实验室里的未来科技&#xff0c;而是实实在…...

Mermaid Live Editor终极指南:3分钟掌握免费在线图表编辑神器

Mermaid Live Editor终极指南&#xff1a;3分钟掌握免费在线图表编辑神器 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live…...

ViGEmBus完全指南:轻松解决Windows游戏手柄兼容性难题

ViGEmBus完全指南&#xff1a;轻松解决Windows游戏手柄兼容性难题 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经遇到过这样的困扰&#xff1a;在…...

AI原生代码审查实战手册(2026奇点大会闭门报告首次解禁)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI原生代码审查&#xff1a;2026奇点智能技术大会Code Review新范式 在2026奇点智能技术大会上&#xff0c;AI原生代码审查&#xff08;AI-Native Code Review&#xff09;正式取代传统人工规则引擎混合…...

Noto字体库:构建全球化数字产品的字体基石

Noto字体库&#xff1a;构建全球化数字产品的字体基石 【免费下载链接】noto-fonts Noto fonts, except for CJK and emoji 项目地址: https://gitcode.com/gh_mirrors/no/noto-fonts 在全球化的数字时代&#xff0c;字体选择已不再是简单的美学决策&#xff0c;而是直…...

抖音批量下载工具架构解析:从技术实现到实战配置指南

抖音批量下载工具架构解析&#xff1a;从技术实现到实战配置指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…...

临近毕业答辩,有哪些真正好用的答辩PPT 生成软件能救急?

毕业答辩进入倒计时&#xff0c;论文刚定稿&#xff0c;却要熬夜做 PPT、理逻辑、排版式&#xff0c;一不小心就熬到凌晨&#xff0c;还容易出现内容跑偏、格式混乱、重点不突出等问题。其实&#xff0c;选对 AI PPT 生成工具&#xff0c;能帮你10 分钟搞定答辩 PPT&#xff0c…...

告别限速!百度网盘解析工具终极使用指南

告别限速&#xff01;百度网盘解析工具终极使用指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘几十KB的龟速下载而烦恼吗&#xff1f;今天我要为你介绍一个…...

告别 Claude Code 封号烦恼使用 Taotoken 稳定接入编程助手

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 告别 Claude Code 封号烦恼使用 Taotoken 稳定接入编程助手 对于依赖 Claude Code 进行编程辅助的开发者而言&#xff0c;服务中断…...