// stack.h

#ifndef _STACK_H_
#define _STACK_H_#ifdef __cplusplus
extern "C" {
#endif/* 栈使用方法举例*      // 声明栈结构并初始化*      stack_t *stack = NULL;*      // 数据压栈*      void *data = get_data(); // get_data为用户函数*      stack_push(&stack, data);*      // 数据出栈*      void *data = stack_pop(&stack);*      // 数据不出栈, 获取栈顶数据*      void *data = stack_top(&stack);*      // 销毁栈*      stack_destroy(&stack, destroy_data); // destroy_data为销毁data的函数*/// 接口声明
typedef struct stack stack_t;
void stack_push(stack_t **pstk, void *value);
void* stack_pop(stack_t **pstk);
void* stack_top(stack_t **pstk);// 调用者自行实现销毁栈的函数, 或调用如下函数销毁栈
static inline void
stack_destroy(stack_t **pstk, void (*destroy_element)(void*))
{void *value;while (!!(value = stack_pop(pstk)))if (destroy_element)destroy_element(value);
}#ifdef __cplusplus
} // extern "C"
#endif#endif // _STACK_H_

// stack.c

#include "stack.h"// stack结构无需对用户暴露
struct stack {int top;int cnt;struct stack *next;void *value[1];
};static inline int
stack_empty(stack_t *stk)
{return (stk->top == -1);
}static inline int
stack_full(stack_t *stk)
{return (stk->top + 1 == stk->cnt);
}#define DEFAULT_STACK_CNT 128static inline void
stack_expand(stack_t **pstk)
{// 这里假定内存分配不会失败,可以实现这样的函数,例如kmem_alloc(size, KM_SLEEP), 分配不到内存则睡眠等待stack_t *stk = malloc(sizeof(stack_t)+ sizeof(void*) * (DEFAULT_STACK_CNT - 1));stk->next = *pstk;stk->top = -1;stk->cnt = DEFAULT_STACK_CNT;*pstk = stk;
}static inline void
stack_reduce(stack_t **pstk)
{stack_t *stk = *pstk;while (stk && stack_empty(stk)) {stack_t *next = stk->next;free(stk);stk = next;}*pstk = stk;
}void
stack_push(stack_t **pstk, void *value)
{if (!*pstk || stack_full(*pstk))stack_expand(pstk);stack_t *stk = *pstk;stk->value[++stk->top] = value;
}void*
stack_pop(stack_t **pstk)
{if (!*pstk)return (NULL);/* stk!=NULL则stk->top一定有效, 因为每次出栈后都会reduce,* 如果全部元素出栈, reduce会释放栈空间, stk会置NULL */stack_t *stk = *pstk;void *value = stk->value[stk->top--];stack_reduce(pstk);return (value);
}void*
stack_top(stack_t **pstk)
{stack_t *stk = *pstk;return (stk ? stk->value[stk->top] : NULL);
}

C语言实现可伸缩的栈结构相关推荐

  1. c语言中栈区运用原理形象图,C语言实现使用动态数组来构造栈结构

    我在面前一篇博客<C语言实现使用静态数组来构造栈结构>中使用了静态数组来模拟栈的操作.静态数组的大小是在代码中写死的.是存储在用户栈上面的,使用起来不灵活.在这篇博客中我会使用动态数组来构 ...

  2. 花式模拟【栈结构】做“日志分析”(洛谷P1165题题解,Java语言描述)

    题目要求 P1165题目链接 分析 标准的栈结构,但使用数组来模拟会更简单. 因为对于这个问题,其实数组不需要存储真实数值,只考虑当前最大值就行了. 毕竟,出栈也不需要返回当前真实值. 另外,我们只使 ...

  3. C语言实现数据结构之栈的详解

    在函数调用的过程中,需要的就是先进后出的特点,因此,栈就出现了. 栈是一种数据结构,是计算机怎么处理程序运行的一种方式.具有先进后出的特点,下面看的就是这些抽象的数据结构怎么用C语言代码来实现,栈能实 ...

  4. 使用栈结构完毕四则运算

    使用栈结构完毕四则运算 思路: 0.初始化 a.操作栈,b.数字栈 ,定义优先级  +:1 , - : 1 , * : 2 , / : 2 1.假设是数字入数字栈 2.假设是左括号,入操作栈 3.假设 ...

  5. 数据结构笔记--栈的总结及java数组实现简单栈结构

    杂谈"栈"结构: 栈(Stack)是一种插入删除操作都只能在一个位置上进表,这个位置位于表的末端,叫做栈顶(Top). 对栈的基本操作有push和pop,表示进栈和出栈.也就相当于 ...

  6. c++怎么实现数字数组的删除数字_C/C++数据结构:栈结构解析,最简单解析,让你一遍就会...

    上一章节针对于C语言最基本的数据结构链式结构体做了解析,不清楚的可以回顾一下.本章节主要针对于C语言的基础数据结构栈做以解析. 数据结构之栈 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅 ...

  7. C语言【数据结构】栈和队列【OJ题(C++)、选择题】

    目录 一.OJ题 1.225. 用队列实现栈 2.232. 用栈实现队列 3.622. 设计循环队列 4.20. 有效的括号 二.选择题 1.下列关于栈的叙述正确的是(B) 2.一个栈的入栈序列为AB ...

  8. 自学B站小甲鱼数据结构课程-C语言实现基础数据结构-栈-的例子

    看这个代码前,建议先看完小甲鱼栈数据结构那节课 栈数据结构讲解 我是第一次学数据结构这个课,这个数据结构课,对C语言水平要求还是有点高的,最基本的就是得熟悉指针,像结构体指针,还有C语言的数据类型了, ...

  9. 有关C语言中字符串入栈的理解

    C语言中字符串的入栈 写在前面 对于C语言中变量入栈的顺序实际上需要具体情况具体分析,不同操作系统下的编译器可能对此有不同的解释,即使对于同一个C的编译器而言,参数设定的不同也会导致编译器调整局部变量 ...

最新文章

  1. esp8266 php 接口,ESP8266_SDK基础(5)智能插座_完整项目代码
  2. CTF工具(1)--- ARCHPR--含安装/使用过程
  3. Linux系统管理员的Bash指南,11条Bash实践经验!
  4. html select不能修改,更改HTML Select元素的选定选项
  5. 【Hadoop Summit Tokyo 2016】欢迎来到Hadoop的青春时代
  6. 悟空 mobile.php,悟空CRM无需任何权限的SQL注入漏洞2(ThinkPHP特性)
  7. excel解决线性规划求解问题
  8. 流程图中的实线_教你如何正确看懂工艺流程图
  9. c语言逻辑运算符意义,c语言逻辑运算符怎么理解?
  10. Tcp四次挥手谁需要等待,为什么等待时间为2MSL
  11. 一个产品的风险预测怎么写_创业计划书中,项目风险评估怎么写?
  12. 价值4800的电销语音机器人完整版源码+文字教程
  13. Surface Laptop2 键盘无响应,只有电源键有效(已解决)
  14. 雷军:相信自己,一往无前(MI10周年演讲精彩语录)
  15. Java程序性能优化 !
  16. PyWiFi 文档说明
  17. 这就是你要的廉价,廉价版iPhoneX到底便宜在哪?
  18. Chained Exceptions in Java
  19. 计算机专业押韵口号16字,创新口号16字押韵创新 鼓励创新的标语
  20. Fastcopy介绍

热门文章

  1. 华为平板可不可以安装Android,华为平板能跟iPad过招?MatePad Pro在安卓称王但用户不一定买单...
  2. RuntimeError: Output 0 of SelectBackward is a view and is being modified inplace.
  3. 计算机在地理科学中的作用,中学地理教学中工具的重要性—胡阳新推荐
  4. html中如何将图片3d转换,jpg格式图片如何可以转换成3DMax格式?
  5. 同仁堂-十大王牌、十大名药
  6. stick棍子by Ye
  7. 【方案分享】2020个人抖音账号打造执行方案(附下载)
  8. Cache简介(一)
  9. 现如今社群乱象,社群玩法正解
  10. 如何知道电脑开机记录?