【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

前面我们讲到了队列,今天我们接着讨论另外一种数据结构:堆栈。堆栈几乎是程序设计的命脉,没有堆栈就没有函数调用,当然也就没有软件设计。那么堆栈有什么特殊的属性呢?其实,堆栈的属性主要表现在下面两个方面:

(1)堆栈的数据是先入后出

(2)堆栈的长度取决于栈顶的高度

那么,作为连续内存类型的堆栈应该怎么设计呢?大家可以自己先试一下:

(1)设计堆栈节点

typedef struct _STACK_NODE
{int* pData;int length;int top;
}STACK_NODE;

(2)创建堆栈

STACK_NODE* alloca_stack(int number)
{STACK_NODE* pStackNode = NULL;if(0 == number)return NULL;pStackNode = (STACK_NODE*)malloc(sizeof(STACK_NODE));assert(NULL != pStackNode);memset(pStackNode, 0, sizeof(STACK_NODE));pStackNode->pData = (int*)malloc(sizeof(int) * number);if(NULL == pStackNode->pData){free(pStackNode);return NULL;}memset(pStackNode->pData, 0, sizeof(int) * number);pStackNode-> length = number;pStackNode-> top= 0;return pStackNode;
}

(3)释放堆栈

STATUS free_stack(const STACK_NODE* pStackNode)
{if(NULL == pStackNode)return FALSE;assert(NULL != pStackNode->pData);    free(pStackNode->pData);free((void*)pStackNode);return TRUE;
}

(4)堆栈压入数据

STATUS stack_push(STACK_NODE* pStackNode, int value)
{if(NULL == pStackNode)return FALSE;if(pStackNode->length == pStackNode->top)return FALSE;pStackNode->pData[pStackNode->top ++] = value;return TRUE;
}

(5)堆栈弹出数据

STATUS stack_pop(STACK_NODE* pStackNode, int* value)
{if(NULL == pStackNode || NULL == value)return FALSE;if(0 == pStackNode->top)return FALSE;*value = pStackNode->pData[-- pStackNode->top];return TRUE;
}

(6)统计当前堆栈中包含多少数据

int count_stack_number(const STACK_NODE* pStackNode)
{return pStackNode->top;
}

建议: 堆栈是函数调用的基础,是递归调用的基础,是很多问题的根源,建议朋友们平时有时间好好练习一下。


【预告: 下面一篇博客介绍链表的内容】

一步一步写算法(之线性堆栈)相关推荐

  1. 一步一步写算法(之线性队列)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 这里的线性结构实际上指的就是连续内存的意思,只不过使用"线性"这个词显得比 ...

  2. 一步一步写算法(之图结构)

    原文:一步一步写算法(之图结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 图是数据结构里面的重要一章.通过图,我们可以判断两个点之间是 ...

  3. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...

  4. 一步一步写算法(之寻找丢失的数)

    一步一步写算法(之寻找丢失的数) 原文:一步一步写算法(之寻找丢失的数) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 假设我们有一个1亿个 ...

  5. 一步一步写算法(之克鲁斯卡尔算法 中)

    一步一步写算法(之克鲁斯卡尔算法 中) 原文:一步一步写算法(之克鲁斯卡尔算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面说到 ...

  6. 一步一步写算法(之prim算法 下)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉了基本的流程.基本上来说,我们是按照自上而下 ...

  7. 一步一步写算法(开篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 算法是计算机的生命.没有算法,就没有软件,计算机也就成了一个冰冷的机器,没有什么实用价值.很多 ...

  8. 编程题C语言写牛牛数星星,一步一步写算法(之“数星星”)

    原文: 一步一步写算法(之"数星星") [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 学过编程的朋友都知道,当初为了学习 ...

  9. 一步一步写算法(之 算法总结)【转】

    转自:http://blog.csdn.net/feixiaoxing/article/details/6993718 版权声明:本文为博主原创文章,未经博主允许不得转载. [ 声明:版权所有,欢迎转 ...

  10. 一步一步写算法(之 算法总结)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 自10月初编写算法系列的博客以来,陆陆续续以来写了几十篇.按照计划,还有三个部分的内容没有介绍 ...

最新文章

  1. CentOS6.9 ARM虚拟机扩容系统磁盘
  2. 如何用 Redis 解决海量重复提交问题
  3. NET MVC3 中的枚举多语言实现,DescriptionPairAttribute
  4. advanced installer重新打包教程
  5. WSAStartup()函数以及DLL的加载
  6. WPF DatePicker 默认显示当前时间
  7. Java13-day04【Integer、int和String的相转、自动装箱和拆箱、Date、SimpleDateFormat、Calendar、异常、try...catch、throws】
  8. java性能调优工具--笔记
  9. [CTF]思维导向图
  10. android phone win10下载,微软Your Phone新功能: 可在Win 10 PC 上运行 Android 应用程序...
  11. javascript - return
  12. 互联网“最强大脑”齐聚乌镇 他们看到了怎样的未来?
  13. [HTML] Prettify 代码高亮使用总结
  14. HTML仿小米官网登陆
  15. Lwm2m的server分析
  16. 视频直播系统源码,简单的移动端轮播图
  17. “诗词吾爱”第38期擂台赛《伤春、惜春》获胜作品欣赏【转载】
  18. Mongodb之Chunk研究
  19. 每日一题#10-22 Ransomware
  20. ubuntu 1204 server xp 硬盘安装

热门文章

  1. 一个核物理学霸为何两次收到BlackHat的邀请
  2. ICE通信之IceGrid服务(一)
  3. 货币化物联网:实现收益
  4. 原生js调用json方法
  5. How to extend a readonly property ?????
  6. PHP字符串中的变量解析(+教你如何在PHP字符串中加入变量)
  7. 学习笔记之软考数据库系统工程师教程(第一版)
  8. Oracle八大性能视图之v$transaction
  9. 银行软件测试工作量分析和评估方法(转)
  10. 民航重组:做大容易做强难