这次更新的关于栈的内容在上次的基础上修补了一部分,上次的内容本身非常简单初级,并且没有考虑栈顶溢出的情况,这次补充。

其次补充了多线程栈的内容,需要去了解锁的知识,在处理数据时都需要加锁。

然后近期正在看一个大概3万行的项目代码,时间紧张,暂不更。

栈在检测到要溢出时加倍。代码如下。

头文件:

#ifndef __STACK_H__
#define __STACK_H__#include "Global.h"#define CAPI_FAILED 0
#define CAPI_SUCCESS 1typedef struct STACK_at
{void** ppBase;UINT uTop;unsigned uStackSize;
}STACK;STACK* Stack_Create(UINT uStackSize);
void Stack_Destroy(STACK* pStack, DESTROYFUNC DestroyFunc);
void* Stack_Pop(STACK* pStack);
INT Stack_Push(STACK* pStack, void* pData);
INT Stack_IsEmpty(STACK* pStack);#endif

c文件:

#include "stack.h"STACK* Stack_Create(UINT uStackSize)
{STACK* pStack;if (uStackSize == 0){return NULL;}pStack = (STACK*)malloc(sizeof(struct STACK_at));if (pStack != NULL){pStack->ppBase = (void**)malloc(uStackSize * sizeof(void*));if (pStack->ppBase == NULL){free(pStack);pStack = NULL;}else{pStack->ppBase[0] = NULL;pStack->uTop = 0;pStack->uStackSize = uStackSize;}}return pStack;
}void Stack_Destroy(STACK* pStack, DESTROYFUNC DestroyFunc)
{if (pStack != NULL){if (pStack->ppBase != NULL){if (DestroyFunc != NULL){UINT i;for (i = 0; i < pStack->uTop; i++){if (pStack->ppBase[i] != NULL){(*DestroyFunc)(pStack->ppBase[i]);}}}free(pStack->ppBase);}free(pStack);pStack = NULL;}
}void* Stack_Pop(STACK* pStack)
{void* pData;if (pStack == NULL || pStack->uTop == 0){return NULL;}pStack->uTop -= 1;pData = pStack->ppBase[pStack->uTop];return pData;
}INT Stack_IsEmpty(STACK* pStack)
{if (pStack->uTop = 0){return 1;}return 0;
}INT Stack_Push(STACK* pStack, void* pData)
{if (pStack == NULL){return CAPI_FAILED;}if (pStack->uTop >= pStack->uStackSize - 1){pStack->ppBase = (void**)realloc(pStack->ppBase, (pStack->uStackSize * 2) * sizeof(void*));if (pStack->ppBase == NULL){return CAPI_FAILED;}pStack->uStackSize *= 2;}pStack->ppBase[pStack->uTop] = pData;pStack->uTop += 1;return CAPI_SUCCESS;
}

多线程栈

头文件如下:

#ifndef __MSTACK_H__
#define __MSTACK_H__#include "stack.h"typedef struct MSTACK_st
{STACK*    pStack;FASTLOCK    FastLock;
}MSTACK;MSTACK* MStack_Create(UINT uStackSize);
void MStack_Destroy(MSTACK* pMStack, DESTROYFUNC DestroyFunc);
void* MStack_Pop(MSTACK* pMStack);
INT MStack_Push(MSTACK* pMStack, void* pData);
INT MStack_IsEmpty(MSTACK* pMStack);#endif

c文件如下

#include "MStack.h"MSTACK* MStack_Create(UINT uStackSize)
{MSTACK* pMStack = (MSTACK*)malloc(sizeof(MSTACK));if (pMStack != NULL){pMStack->pStack = Stack_Create(uStackSize);if (pMStack->pStack != NULL){/*锁*/InitializeCriticalSection(&(pMStack->FastLock));return pMStack;}free(pMStack);}return NULL;
}void MStack_Destroy(MSTACK* pMStack, DESTROYFUNC DestroyFunc)
{if (pMStack != NULL){EnterCriticalSection(&(pMStack->FastLock));Stack_Destroy(pMStack->pStack, DestroyFunc);DeleteCriticalSection(&(pMStack->FastLock));free(pMStack);}
}void* MStack_Pop(MSTACK* pMStack)
{void* pData;EnterCriticalSection(&(pMStack->FastLock));pData = Stack_Pop(pMStack->pStack);DeleteCriticalSection(&(pMStack->FastLock));return pData;
}INT MStack_Push(MSTACK* pMStack, void* pData)
{INT nRet;EnterCriticalSection(&(pMStack->FastLock));nRet = Stack_Push(pMStack->pStack, pData);DeleteCriticalSection(&(pMStack->FastLock));return nRet;
}INT MStack_IsEmpty(MSTACK* pMStack)
{INT nRet;EnterCriticalSection(&(pMStack->FastLock));nRet = Stack_IsEmpty(pMStack->pStack);DeleteCriticalSection(&(pMStack->FastLock));return nRet;
}

转载于:https://www.cnblogs.com/Vcanccc/p/5682928.html

写了一个栈和多线程栈,修补上次的数据结构的栈的知识相关推荐

  1. c++数据结构队列栈尸体_一本正经的聊数据结构(3):栈和队列

    前文传送门: 「一本正经的聊数据结构(1):时间复杂度」 「一本正经的聊数据结构(2):数组与向量」 引言 前一篇内容我们介绍了数组和向量,虽然说向量是数组的一个升级版,但是在另一个维度上,他们都属于 ...

  2. 给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构(算法导论第十章10.4-3)

    给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构 (算法导论第十章10.4-3) template<typename T> ...

  3. 女朋友学高数,我花了 15 分钟用栈给她写了一个计算器 | 原力计划

    作者 | 天才程序YUAN 责编 | 夕颜 头图 | CSDN 下载自东方 IC 出品 | CSDN(ID:CSDNnews) 前记 女朋友说:"高数好难,看我最近挺辛苦的,你送我一个礼物给 ...

  4. 女朋友学高数,我花了15分钟用栈给她写了一个计算器

    前记 女朋友说:"高数好难,看我最近挺辛苦的,你送我一个礼物给我,让我开心一下吧.你猜猜我想要什么." 我想了半天,从书到鞋子到电子产品最后到生活用品,感觉什么都不缺,然后和她说: ...

  5. 数据结构之栈,栈是很多算法的基础知识,本文带你从0开始了解栈并手写一个栈

    栈(Stack) 一.目录 1.栈的基本介绍 2.栈的相关术语 3.栈的特点 4.栈实现的基本思路 5.栈的图解 6.数组实现栈的原码 7.栈的应用 二.正文 1.栈的基本介绍 栈的英文为Stack, ...

  6. Java笔记整理五(Iterator接口,泛型,常见数据结构(栈,队列,数组,链表,红黑树,集合),jdk新特性,异常,多线程,Lambda表达式)

    Java笔记整理五 1.1Iterator接口 Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象 ...

  7. 金九银十!阿里P8手写的内部Java核心开发成长手册,涵盖p5-p8技术栈,秋招必看!

    前言 程序员的年龄一直是大家讨论的热门话题,本人最近和不少小公司的程序员打交道.经过和他们的深入交流,我感受到了不少小公司程序员的现状,由此深深地感叹,可能真有不少小公司的程序员未必能干到30岁,甚至 ...

  8. python写机器人程序_用Python写的一个多线程机器人聊天程序

    本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...

  9. java递归栈_java-66-用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。颠倒之后的栈为{5,4,3,2,1},5处在栈顶...

    import java.util.Stack; public class ReverseStackRecursive { /** * Q 66.颠倒栈. * 题目:用递归颠倒一个栈.例如输入栈{1,2 ...

最新文章

  1. 某32岁大厂程序员吐槽:简历通过率才30%!大龄韭菜该何去何从?网友:没那么严重,同32岁,简历通过率90%!...
  2. 【PHPMailer】写一封邮件
  3. 用java数组模拟登录和注册功能
  4. Kubuntu中thunderbird最小化到任务栏
  5. wps居中对齐不在中间_WPS文字快捷键总结(Windows版本)--值得收藏
  6. Unity3D-RayMarch-几何图元1-添加基本着色模型
  7. 抓住数字经济机遇 新华三助力客户加速转型
  8. 使用宝塔控制面板建站时出现网页出现404错误怎么办?
  9. 关于“VS2013无法启动程序,系统找不到指定的文件“这个问题的一个解决方法
  10. UIFont各种字体
  11. 24小时改变你的人生【转】
  12. AD9361 补充(中)
  13. 【信号处理】采样定理的深入浅出
  14. java中日期转换_java中日期格式的转换
  15. 电信悦meYMB0300-CW-卡刷-刷机固件
  16. 婚庆摄影公司网站源码搭建
  17. 中科院博士论文《致谢》
  18. 猫喜欢吃鱼,可猫不会游泳,鱼喜欢吃蚯蚓,可鱼不会上岸;上帝给了你很多诱惑,却不会让你轻易实现!...
  19. linux个人学习记录
  20. 验证手机号码 (包含166和199)

热门文章

  1. 【以太坊】web3.js的1.0版本和0.2.0版本的安装及区别
  2. Java面试题!Java获取异常堆栈信息
  3. 【Java Web前端开发】web概念概述和HTML基础部分
  4. python【力扣LeetCode算法题库】300 最长上升子序列(动态规划)
  5. Unet实现图像分割(四)
  6. sqlserver2000 php5.4,PHP添加Mssql/sqlserver2000扩展,适用于Php5.2/Php5.3/Php5.4
  7. linux底层硬件需求,Linux系统的硬件设备驱动的底层结构讲解
  8. 写出最感兴趣的软件测试工作,你还不会写测试用例?!注意这五点,写出模板级的测试用例!...
  9. 不能用了 重装系统git_重装新版gitlab时遇到gitlab-rails database初始化失败
  10. 友情链接优化的技巧分享