尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
AI开发C语言应用按步走,表达式计算器calc的第七步,哈希表符号表
calc7 — 哈希表符号表1. 概述本次迭代将 calc5 引入的线性查找符号表替换为哈希表实现大幅提升变量查找性能和容量上限。性能变化指标calc5/calc6线性数组calc7哈希表数据结构线性查找数组djb2 哈希 线性探测变量上限64256查找复杂度O(n)O(1) 平均动态内存分配无无静态数组外部 API不变不变2. 变更清单文件操作说明sym.h编辑SYM_MAX 64→SYM_BUCKETS 256sym.c重写线性查找数组 → 哈希表实现其余文件无需改动API 签名不变eval.c/main.c零改动3. 哈希表设计3.1 数据结构#defineSYM_BUCKETS256typedefstruct{charname[32];intvalue;intoccupied;/* 0 空槽1 已占用 */}SymEntry;staticSymEntry sym_table[SYM_BUCKETS];采用开地址法Open Addressing所有条目存储在静态数组中不引入malloc保持零动态内存分配。3.2 哈希函数djb2staticunsignedlonghash(constchar*str){unsignedlongh5381;intc;while((c(unsignedchar)*str))h((h5)h)(unsignedlong)c;returnh%SYM_BUCKETS;}djb2 由 Daniel J. Bernstein 设计以其良好的分布性和简单性著称适合字符串哈希场景。3.3 冲突解决线性探测当哈希值冲突时顺序检查下一个槽位直到找到同名条目或空槽unsignedlongidxhash(name);for(inti0;iSYM_BUCKETS;i){unsignedlongcur(idxi)%SYM_BUCKETS;if(!sym_table[cur].occupied){/* 空槽 → 写入新条目 */memcpy(sym_table[cur].name,name,n);sym_table[cur].valueval;sym_table[cur].occupied1;return;}if(strcmp(sym_table[cur].name,name)0){/* 已存在 → 更新值 */sym_table[cur].valueval;return;}}3.4 API 实现对比操作线性数组实现哈希表实现sym_set遍历全表查找同名再找空槽哈希定位 → 线性探测sym_get遍历全表匹配哈希定位 → 线性探测sym_print遍历 sym_count 个条目遍历 256 个桶检查 occupiedsym_clearsym_count 0memset(sym_table, 0, sizeof(sym_table))4. 目录结构calc/ ├── Makefile ├── parse.h / parse.c ├── eval.h / eval.c ├── sym.h / sym.c # 哈希表实现 ├── main.c ├── test.expr # 24 个测试用例 ├── doc/ │ ├── calc1.md # tokenizer 基础 │ ├── calc2.md # 取模、负号区分、测试套件 │ ├── calc3.md # 表达式求值器 │ ├── calc4.md # 交互式 REPL │ ├── calc5.md # 变量绑定 增强错误提示 │ ├── calc6.md # 测试覆盖增强 │ └── calc7.md # 本次构建哈希表符号表 └── build/ └── calc5. 测试验证$maketestcalc — 测试套件PASS[1](90-18)/315 →39PASS[2]10%3 →1PASS[3]-53 →-2PASS[4]3-5 →-2PASS[5](-3)→-3PASS[6](-820)%-3 →0PASS[7]35→8PASS[8]35*2 →13PASS[9](35)*2 →16PASS[10]10/23 →8PASS[11]10%3*2 →2PASS[12]--5→5PASS[13]-3*2 →-6PASS[14]12345 →15PASS[15]((35)*2)→16PASS[16]35 → error PASS[17]3/0 → error PASS[18]3%0 → error PASS[19](35 → error PASS[20]35)→ error PASS[21]35 x → error PASS[22]empty→ error PASS[23]x5→ error PASS[24]y10→ error24passed,0failed,24total内部实现变更对外行为不变24/24 回归测试全部 PASS。
RELATED

相关推荐

大型C++项目维护必备:cppclean检测未声明函数与不一致头文件引用

大型C++项目维护必备:cppclean检测未声明函数与不一致头文件引用

大型C项目维护必备:cppclean检测未声明函数与不一致头文件引用 【免费下载链接】cppclean Finds problems in C source that slow development of large code bases 项目地址: https://gitcode.com/gh_mirrors/cp/cppclean 在大型C项目开发中,代码…

📅 2026/9/15 12:49:52
大提琴听起来像在“唱歌”?从发声原理到千元入门大提琴实测推荐

大提琴听起来像在“唱歌”?从发声原理到千元入门大提琴实测推荐

同样是用弓拉弦,小提琴清亮高亢,中提琴温厚内敛,低音提琴深沉轰鸣。唯独大提琴,被一代又一代人形容为“最接近人声的乐器”。这个评价不是修辞上的美化,而是有实实在在的声学依据。一、大提琴的“嗓音”,藏…

📅 2026/9/15 13:59:55
查询 DNS 解析**的工具,nslookup , dig,Resolve-DnsName等

查询 DNS 解析**的工具,nslookup , dig,Resolve-DnsName等

nslookup、dig 简单讲解(DNS 域名解析查询命令) 两个都是查询 DNS 解析的工具,用来查域名对应的 IP、DNS 记录、服务器信息,排查域名/网络解析问题。 一、nslookup Windows / Linux 都自带,上手最简单。 作用 查域名 →…

📅 2026/9/18 13:10:08
MORE NEWS

更多资讯

📰

容器编排器之战复盘:Kubernetes胜出的底层逻辑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

RK3588边缘AI实战:16GB内存与128GB存储的并发优化与部署指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

CH340/CH341驱动在Win10/Win11上的异常修复与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

开源股票分析工具OpenStock:Docker部署与自定义实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

熬夜掉发怎么选防脱洗发水?成分表+表活体系+强韧发根实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

013.开源OpenSCAD+BOLS2齿轮插件 生成齿轮

一.配置OpenSCAD建模环境谷歌搜索 OpenSCAD 进入官网下载,找到zip免安装的软件文件包.zip下载下来解压后把文件夹放到自己习惯的路径二.下载配置BOLS2齿轮插件搜索BOLS2 ,找到github上的BOLS2项目内容,把他下载下来将下载解压后的文件,移动到OpenSCAD免安装软件文件包的librari…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬