开源库uthash第三弹utstack.h

2023-11-17

一、简介

1.1 介绍

utstack.h中包含了一组动态stack宏。使用起来非常简单,只需要将utstack.h拷贝到你的项目,并包含进你的源码即可:

#include "utstack.h"

utstack.h宏支持栈的基本的操作:push、pop、count,以及获取顶部元素操作。其内部实现为连接的链表。

1.2 源码获取

utlist.h的源码可以在GitHub上直接获取(src/utstack.h):

https://github.com/troydhanson/uthash

二、使用方法

2.1 栈头声明

栈头是一个结构体指针,指向你自己定义的结构体,注意必须初始化为NULL

element *stack = NULL

2.2 栈操作

栈的操作只有O(1)的push,O(1)的pop和O(n)的count方法。

为了保证你代码的可读性,你可以使用STACK_EMPTY(head)替代head == NULL,使用STACK_TOP(head)替代head。

Operations description
STACK_PUSH(stack,add); push add onto stack
STACK_POP(stack,elt); pop stack and save previous top as elt
STACK_COUNT(stack,tmp,count); store number of elements into count
STACK_TOP(stack) return stack
STACK_EMPTY(stack) return stack == NULL

表格中用到的参数说明如下:

  • stack:The stack head (a pointer to your element structure).
  • add:A pointer to the element structure you are adding to the stack.
  • elt:A pointer that will be assigned the address of the popped element. Need not be initialized.
  • tmp:A pointer of the same type as elt. Used internally. Need not be initialized.
  • count:An integer that will be assigned the size of the stack. Need not be initialized.

2.3 一个简单的实例

下面的实例读取文件内容,然后push每行到stack,然后pop取出数据后打印出来。

/* A stack of names*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "utstack.h"

#define BUFLEN 20

typedef struct el {
    char bname[BUFLEN];
    struct el *next;
} el;

el *head = NULL; /* important- initialize to NULL! */

int main(int argc, char *argv[]) {
    el *elt;

    char linebuf[BUFLEN];
    int count;
    FILE *file = fopen("test11.dat", "r");
    if (file == NULL) {
        perror("can't open: ");
        exit(-1);
    }

    while (fgets(linebuf, sizeof linebuf, file) != NULL) {
        el *name = malloc(sizeof *name);
        if (name == NULL) exit(-1);
        strcpy(name->bname, linebuf);
        STACK_PUSH(head, name);
    }
    fclose(file);

    STACK_COUNT(head, elt, count);
    printf("%d elements were read into the stack\n", count);

    /* now pop, print, and delete each element */
    while (!STACK_EMPTY(head)) {
        printf("%s\n", STACK_TOP(head)->bname);
        STACK_POP(head, elt);
        free(elt);
    }

    return 0;
}

2.4 其他宏

当你的结构体的next字段命名不是next,那么你可能会用到如下宏:

Operations description
STACK_PUSH2(stack,add,next); push add onto stack
STACK_POP2(stack,elt,next); pop stack and save previous top as elt
STACK_COUNT2(stack,tmp,count,next); store number of elements into count
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开源库uthash第三弹utstack.h 的相关文章

  • 裸机环境下malloc什么时候返回NULL?

    有一个c内存模型如下 Last Address of RAM Stack v RAM Heap ZI RW First Address of RAM 堆栈和堆空间以相反的方向增加 它们会在中间相互重叠
  • Linux 内核如何强制堆栈大小限制?

    我知道堆栈大小可以通过限制工具进行控制 但是内核如何强制执行其中一些限制 例如 RLIMIT STACK 由于linux不涉及堆栈操作 只是mov或push指令 那么当超出限制时内核如何发出SIGSEGV 据我了解 对于虚拟寻址 CPU 提
  • C# 检查表达式括号是否有效[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 表达方式 a i 1 8 9 应该返回 true 因为这样编写语法是有效的 每个左括号在正确的位置都有一个右闭合器 并且所有括号都处于
  • memcpy 溢出边界利用? (破坏堆栈)

    我试图弄清楚这是否会以某种方式溢出 void print address char p arp hw int i hw length size p OFFSET1 189 4 193 memcpy hw addr packet OFFSET
  • stack,foreach,顺序错误?

    当使用Java的for每个语法 Stack不对输出元素使用 LIFO 排序 考虑以下代码 import java util Queue import java util Stack import java util LinkedList p
  • 堆栈里面有什么?

    如果我运行一个程序 就像 include
  • 左结合性仅适用于 Postfix 表达式吗?

    在计算后缀表达式时 关联性是否总是从左到右 如果是 为什么 如果没有 为什么 None
  • 有意的缓冲区溢出并不总是导致程序崩溃

    考虑以下最小 C 程序 案例编号1 include
  • Android:清除后退堆栈

    在 Android 中 我有一些活动 比如说 A B C 在A中 我使用以下代码打开B Intent intent new Intent this B class startActivity intent 在B中 我使用以下代码打开C In
  • 我怎样才能看到我的delphi应用程序当前使用了多少堆栈空间?

    我怎样才能看到我的delphi应用程序当前使用了多少堆栈空间 我曾有一个very奇怪的错误听起来像是堆栈问题 我想将其添加到我的应用程序日志中 以了解正在使用 剩余的堆栈空间有多少 使用调试器可能不太好 因为可以多次调用例程 谢谢你 这应该
  • 在 D 中制作结构体的堆副本

    如何创建堆栈上结构的垃圾收集副本 来自 C 背景 我的第一个猜测是像下面这样的复制构造函数 但它对于 D 来说似乎不太惯用 而且我在我看过的任何 D 项目中都没有看到过这样的复制构造函数 struct Foo immutable int b
  • 在Java中,为什么Stack是一个具体类,而Queue是一个接口?

    Queue 的哪一个子类是 普通 队列 1 java util Stack 是 Java 1 0 的遗留类 它早于 Collections 框架很多年 坦率地说 它是一个例子horrible多方面的设计 一切都不是事情应有的样子 主要问题是
  • 如何在 Kotlin 中使用堆栈?

    如何在 Kotlin 中使用 Stack 来自 java 或者还有其他替代方案吗 我正在尝试将列表转换为堆栈 科特林 1 3 70介绍了kotlin collections ArrayDeque https kotlinlang org a
  • Bluecove:以编程方式重新启动蓝牙堆栈

    我正在尝试关闭蓝牙服务 但 Bluecove 在连接关闭方法上有错误 https code google com p bluecove issues detail id 90 https code google com p bluecove
  • 如何增加 Qt 中线程的堆栈大小 - QThread::setStackSize() 似乎不起作用?

    从问题来看 运行批量插入或替换 500 行时 SQLite 堆栈溢出 为什么 https stackoverflow com questions 22576958 sqlite stack overflow when running a b
  • C - '=' 标记之前的预期表达式...在没有 '=' 的行上

    我疯狂地试图找出这个与现实 我的代码没有明显联系的错误消息 我一直在这里搜索并得出一个结论 你会讨厌 typedef 隐藏的指针 抱歉 这超出了我的控制范围 教授以这种方式提供了代码 我正在编辑问题中指定的代码 我弹出完整节点以避免每个推送
  • 如何避免将相同的片段添加到堆栈中

    我需要一些帮助 他们以这种方式将片段添加到活动中 问题是每次调用 openFragment 时都会创建片段并添加 这是显而易见的 问题 我做了什么修改 这样它只能添加一次片段 在下次使用相同片段标签的调用时 它将什么也不做 案例 第一次按下
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 检测堆栈已满

    在编写 C 代码时 我了解到使用堆栈来存储内存是一个好主意 但最近我遇到了一个问题 我有一个实验 其代码如下所示 void fun const unsigned int N float data 1 N N float data 2 N N
  • 通过在 R 中填充 NA - 使栅格达到相同程度

    我有几个具有不同几何形状 轮廓的裁剪栅格 具体而言 同一田地的几年的空间产量图 但范围有所不同 测量并不总是整个田地的整体 但在某些年份只是其中的一部分 我想计算这些地图的平均值并将它们组合成一个平均值栅格 然而 这确实意味着 假设 5 层

随机推荐

  • Apache相关的几个安全漏洞修复

    最近网站被扫描出几个漏洞 大部分都是apache配置引起的 在此记录一下怎么修复 1 检测到目标URL存在http host头攻击漏洞 头攻击漏洞 比较常见的漏洞 修复的方法也提供了 漏洞的详细描述 为了方便的获得网站域名 开发人员一般依赖
  • 轻松调试线上的app之抓包工具stream

    痛点 对于一个线上app 是不是会因为无法调试而痛苦不堪 今天就给大家介绍一款好用的ios抓包应用 安装 1 在appstore中搜索stream 直接下载 2 打开软件 设置https抓包 对于https我们需要安装一下证书 具体原因可以
  • Android基础面试常常死在这几个问题上,移动架构师成长路线

    近日一好友去阿里面试 面试失败了 分享了一个他最不擅长的算法面试题 题目是这样的 题目 给定一个二叉搜索树 BST 找到树中第 K 小的节点 出题人 阿里巴巴出题专家 文景 阿里云 CDN 资深技术专家 参考答案 考察点 基础数据结构的理解
  • java socket——心跳包

    首先先说说心跳包在socket连接中的意义 通过socket连接的双方为了保证在一段时间未发消息不被防火墙断开连接或者使对方及时知道自己是否已经断线而定期给对方发送的某些特殊标识字符 这个字符可以根据双方自定义 没有实际的通讯意义 而定制的
  • 前奏

    上期我们一起学了CNN中四种常用的卷积操作 如下链接 CNN中常用的四种卷积详解 从这期开始 我们开始步入目标检测领域的大门 开始逐步一层一层的揭开目标检测的面纱 路要一步一步的走 字得一个一个的码 步子不能跨太大 太大容易那个啥 字也不能
  • Appnium下载及安装

    Appnium官方访问地址为 http appium io 可访问查看关于Appnium的相关资料 根据官网提供的安装步骤 gt brew install node get node js gt npm install g appium g
  • 预览图片pdf等文件

    文件下载直接返回流即可 但是如果返回图片pdf等 不想下载只想预览下 即可以设置不同的头 返回不同的预览流 文件预览 param bucketName 桶名称 param request 请求 param response 请求响应 pub
  • 2023华为OD机试真题Java实现【篮球比赛/深度优先搜索】【2023.Q2】

    题目内容 在篮球比赛中 每个队员的实力不通 队伍的实力计算方式为所有球员战斗力之和为该队伍的总体战斗力 篮球队员的总人数为10 他们分成两个队伍 教练希望2个队伍的战斗力差值能够尽可能的小 请你帮他实现目标 给出10个球员的战斗力 如果你是
  • 【华为OD机试】导师请吃火锅【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 入职后 导师会请你吃饭 你选择了火锅 火锅里会在不同时间下很多菜 不同食材要煮不同的时间 才能变得刚好合适 你希望吃到最多的刚好合适的菜 但你的手速不够快 用m代表手
  • uniapp项目中防止用户重复提交

    1 在根目录下新建common文件并创建common js文件 代码直接复制粘贴即可 防止处理多次点击 function noMultipleClicks methods info methods是需要点击后需要执行的函数 info是点击需
  • CE认证EMC指令测试项及测试内容(智能开关)

    目录 发射 EMISSiON 1 交流电源端口传导发射Conducted Emissions from the AC mains power ports 2 辐射发射Radiated Emissions 3 谐波电流Harmonic Cur
  • SpringBoot项目中常见的参数传输方式

    传参方式 例子 请求方式 获取参数方式 说明 query 传统方式 getUser id 1 get和post 选用 RequestParam PathParam 路径传参 使用实体类 path REST风格 user 1 get和post
  • 【Redis】分布式锁

    Redis分布式锁 问题描述 随着业务发展的需要 原单体单机部署的系统被演化成分布式集群系统后 由于分布式系统多线程 多进程并且分布在不同机器上 这将使原单机部署情况下的并发控制锁策略失效 单纯的Java API并不能提供分布式锁的能力 为
  • Matlab多维数组漫谈教程

    MATLAB是一种强大的科学计算和数据分析工具 它支持多维数组操作 这使得它在处理复杂数据和矩阵计算方面非常出色 本文将详细介绍MATLAB中的多维数组以及如何使用它们进行各种操作 首先 我们需要了解多维数组的概念 多维数组是一个由元素组成
  • [从零开始学DeepFaceLab-2]: 使用-Windows可执行工具的下载、解压

    目录 前言 第1步 登录github官网 第2步 找到可执行程序下载入口
  • ElasticSearch安装在Windows上详细教程

    ElasticSearchWindows安装教程 Download Elasticsearch Elastic 解压ElasticSearch 打开elasticsearch 6 4 2 bin调用黑窗口 输入elasticsearch b
  • 给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。

    class Solution public vector
  • 2023第五届CCPC河南省赛

    2023第五届CCPC河南省赛经历和题解 题目链接 榜单 经历 算法生涯第一场比赛正好是三年以来第一次线下省赛 因为学校不报销 QAQ 我和我们班两个同学三个大一一队跟着学长学姐一队一起自费趁着周六日假期从洛阳跑到郑州打比赛 周六晚上六点十
  • android项目迁移到androidX:类映射(android.support.v4*)

    支持库类 AndroidX 类 android support v4 accessibilityservice AccessibilityServiceInfoCompat androidx core accessibilityservic
  • 开源库uthash第三弹utstack.h

    文章目录 一 简介 1 1 介绍 1 2 源码获取 二 使用方法 2 1 栈头声明 2 2 栈操作 2 3 一个简单的实例 2 4 其他宏 一 简介 1 1 介绍 utstack h中包含了一组动态stack宏 使用起来非常简单 只需要将u