C语言实现可伸缩的栈结构
// 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语言实现可伸缩的栈结构相关推荐
- c语言中栈区运用原理形象图,C语言实现使用动态数组来构造栈结构
我在面前一篇博客<C语言实现使用静态数组来构造栈结构>中使用了静态数组来模拟栈的操作.静态数组的大小是在代码中写死的.是存储在用户栈上面的,使用起来不灵活.在这篇博客中我会使用动态数组来构 ...
- 花式模拟【栈结构】做“日志分析”(洛谷P1165题题解,Java语言描述)
题目要求 P1165题目链接 分析 标准的栈结构,但使用数组来模拟会更简单. 因为对于这个问题,其实数组不需要存储真实数值,只考虑当前最大值就行了. 毕竟,出栈也不需要返回当前真实值. 另外,我们只使 ...
- C语言实现数据结构之栈的详解
在函数调用的过程中,需要的就是先进后出的特点,因此,栈就出现了. 栈是一种数据结构,是计算机怎么处理程序运行的一种方式.具有先进后出的特点,下面看的就是这些抽象的数据结构怎么用C语言代码来实现,栈能实 ...
- 使用栈结构完毕四则运算
使用栈结构完毕四则运算 思路: 0.初始化 a.操作栈,b.数字栈 ,定义优先级 +:1 , - : 1 , * : 2 , / : 2 1.假设是数字入数字栈 2.假设是左括号,入操作栈 3.假设 ...
- 数据结构笔记--栈的总结及java数组实现简单栈结构
杂谈"栈"结构: 栈(Stack)是一种插入删除操作都只能在一个位置上进表,这个位置位于表的末端,叫做栈顶(Top). 对栈的基本操作有push和pop,表示进栈和出栈.也就相当于 ...
- c++怎么实现数字数组的删除数字_C/C++数据结构:栈结构解析,最简单解析,让你一遍就会...
上一章节针对于C语言最基本的数据结构链式结构体做了解析,不清楚的可以回顾一下.本章节主要针对于C语言的基础数据结构栈做以解析. 数据结构之栈 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅 ...
- C语言【数据结构】栈和队列【OJ题(C++)、选择题】
目录 一.OJ题 1.225. 用队列实现栈 2.232. 用栈实现队列 3.622. 设计循环队列 4.20. 有效的括号 二.选择题 1.下列关于栈的叙述正确的是(B) 2.一个栈的入栈序列为AB ...
- 自学B站小甲鱼数据结构课程-C语言实现基础数据结构-栈-的例子
看这个代码前,建议先看完小甲鱼栈数据结构那节课 栈数据结构讲解 我是第一次学数据结构这个课,这个数据结构课,对C语言水平要求还是有点高的,最基本的就是得熟悉指针,像结构体指针,还有C语言的数据类型了, ...
- 有关C语言中字符串入栈的理解
C语言中字符串的入栈 写在前面 对于C语言中变量入栈的顺序实际上需要具体情况具体分析,不同操作系统下的编译器可能对此有不同的解释,即使对于同一个C的编译器而言,参数设定的不同也会导致编译器调整局部变量 ...
最新文章
- esp8266 php 接口,ESP8266_SDK基础(5)智能插座_完整项目代码
- CTF工具(1)--- ARCHPR--含安装/使用过程
- Linux系统管理员的Bash指南,11条Bash实践经验!
- html select不能修改,更改HTML Select元素的选定选项
- 【Hadoop Summit Tokyo 2016】欢迎来到Hadoop的青春时代
- 悟空 mobile.php,悟空CRM无需任何权限的SQL注入漏洞2(ThinkPHP特性)
- excel解决线性规划求解问题
- 流程图中的实线_教你如何正确看懂工艺流程图
- c语言逻辑运算符意义,c语言逻辑运算符怎么理解?
- Tcp四次挥手谁需要等待,为什么等待时间为2MSL
- 一个产品的风险预测怎么写_创业计划书中,项目风险评估怎么写?
- 价值4800的电销语音机器人完整版源码+文字教程
- Surface Laptop2 键盘无响应,只有电源键有效(已解决)
- 雷军:相信自己,一往无前(MI10周年演讲精彩语录)
- Java程序性能优化 !
- PyWiFi 文档说明
- 这就是你要的廉价,廉价版iPhoneX到底便宜在哪?
- Chained Exceptions in Java
- 计算机专业押韵口号16字,创新口号16字押韵创新 鼓励创新的标语
- Fastcopy介绍
热门文章
- 华为平板可不可以安装Android,华为平板能跟iPad过招?MatePad Pro在安卓称王但用户不一定买单...
- RuntimeError: Output 0 of SelectBackward is a view and is being modified inplace.
- 计算机在地理科学中的作用,中学地理教学中工具的重要性—胡阳新推荐
- html中如何将图片3d转换,jpg格式图片如何可以转换成3DMax格式?
- 同仁堂-十大王牌、十大名药
- stick棍子by Ye
- 【方案分享】2020个人抖音账号打造执行方案(附下载)
- Cache简介(一)
- 现如今社群乱象,社群玩法正解
- 如何知道电脑开机记录?