一直想做一个链表实现的栈,今天终于实现了。确实比数组要难多了,打了很久,很长时间花在了想象上(指针调试比较复杂。。)

但是链表实现有一个最大的好处,就是动态分配内存,所以一般不会出现栈顶溢出的问题。

值得一提的是代码中比昨天的多了一个build函数。建立一个新栈。那么init函数,还是初始化一个栈。昨天用数组写的时候这两个函数是一样的。但是用链表之后才发现两者还是有区别。一个是从无到有,一个是从有到无。只不过数组的时候本来都有,不涉及自己申请空间的问题,所以两个的操作可以相同,但是到了链表,内存要自己申请和释放,这两个函数也就不一样了。不过写完这个栈,我对c++里封装的集合对象有了一点想法,不知道和我想的是不是一样。等假期看c++primer的时候看一下。

下面是代码:

#include<stdio.h>
#include<stdlib.h>typedef struct _node{int num;struct _node *next;
}node;struct stack {node * bottom;node * top;
}s;void build(struct stack &S)
{S.bottom=(node *)malloc(sizeof(node));S.bottom->next=NULL;S.top=(node *)malloc(sizeof(node));S.top->next=S.bottom;
}int sempty(struct stack &S)
{if ((S.top)->next==S.bottom) return 1;else return 0;
}int pop(struct stack &S)
{if (sempty(S)) {printf("栈为空,弹出失败!\n");}else {node *p;p=S.top;S.top=(S.top)->next;int k=p->num;free(p);return k;}
}void init(struct stack &S)
{while (!sempty(S)) {pop(S);}
}void push(struct stack &S,int n)
{node *p;p=(node *)malloc(sizeof(node));p->num=n;p->next=S.top;S.top=p;
}void showstack(struct stack S)
{while ((S.top)->next!=S.bottom){int k=(S.top)->num;S.top=(S.top)->next;printf("|%d|\n",k);}printf("| |\n");printf(" - \n");
}int main()
{printf("1:初始化栈;2:入栈;3:出栈;4:退出。\n");build(s);int n;while (1) {int k;scanf("%d",&k);switch(k) {case 1:init(s); break;case 2:scanf("%d",&n); push(s,n); break;case 3:pop(s); break;case 4:return 0;}showstack(s);}    return 0;
}

实际上在这个栈的结构体里bottom指针并不是必要的,但是在队列中的话head和tail指针都是必要的,所以这样写的话,在队列里稍作修改也是有通用性的。

转载于:https://www.cnblogs.com/itlqs/p/5117476.html

算法导论9:栈的链表实现 2016.1.9相关推荐

  1. 用一个单链表L实现一个栈(算法导论第十章10.2-2题)

    用一个单链表L实现一个栈(算法导论第十章10.2-2题) template<typename T> class HalfNode {public:T key;HalfNode* next; ...

  2. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  3. 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)

    C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...

  4. 利用链表实现可合并堆(算法导论第三版思考题10-2)

    利用链表实现可合并堆(算法导论第三版思考题10-2) a 链表已排序 创建一个空堆: Θ(1) 插入:Θ(n),插入后依然保持排序 最小值:Θ(1),第一位便是 取最小值:Θ(1) 合并:Θ(n),可 ...

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

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

  6. Θ(n)反转单链表(算法导论第三版第十章10.2-7)

    Θ(n)反转单链表 (算法导论第三版第十章10.2-7) template<typename T> void reverses(Single_L<T> &l) {if( ...

  7. 用一个单链表L实现一个队列(算法导论第十章10.2-3)

    用一个单链表L实现一个队列(算法导论第十章10.2-3) template<typename T> class HalfNode {public:T key;HalfNode* next; ...

  8. 设单链表中存放n个字符,试设计一个算法,使用栈推断该字符串是否中心对称...

    版权声明:本文为博主原创文章.未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/28281631 转载请注明出 ...

  9. 设计一个算法,借助栈实现单链表链接顺序的逆转

    设计一个算法,借助栈实现单链表链接顺序的逆转: 程序思路:题目要求为借助栈将单链表中的数据逆置输出,栈的特点就是先进后出,只 需要将单链表中的数据依次存储在栈中,然后将栈中的元素依次取出即可.关键代码 ...

最新文章

  1. 怎么去除图像亮度对图像质量评价的影响_图像质量评估指标 SSIM / PSNR / MSE
  2. 买不起手办就用AI渲染一个!用网上随便搜的图就能合成,已有网友开炒游戏NFT...
  3. Excel使用控件创建动态地图图表
  4. Spring的AOP-AspectJ注解方式
  5. 机器学习在高德起点抓路中的应用实践
  6. .Net转Java自学之路—基础巩固篇二十(Lambda)
  7. 爱奇艺、优酷、腾讯独播内容均超70%,如果只能三选一,哪家会员最值得买?
  8. java数组包含某个值_如何检查Java数组是否包含值?
  9. 我常用的分页存储过程
  10. wordpress主题_ripro美化子主题_虎造子主题集成后台美化包v2.0
  11. MySQL数据库语句
  12. 笔记本电脑网卡驱动损坏问题
  13. python编写程序掷骰子游戏规则_通过构建一个简单的掷骰子游戏去学习怎么用Python编程...
  14. 计算机通信网自学笔记(2)
  15. 关于 mysql数据库“ERROR 1118 (42000): Row size too large.“ 的解决方法
  16. Unity SetFromToRotation和FromToRotation的区别
  17. 我是如何入行嵌入式开发的
  18. 脚本小子进阶之路(一)用开源武装自己
  19. D435i安装驱动时遇到的configuring Secure Boot问题
  20. 推荐一款绝对不能错过的 ORM 框架 dbVisitor,目前版本 4.3.0

热门文章

  1. 剑指offer面试题[6]-重建二叉树
  2. springboot mybatisplus 多数据源_【SpringBoot DB 系列】MybatisPlus 多数据源配置
  3. Python之configparser模块详解和使用
  4. 可能这就是我应用pytest搭建的第一个测试框架吧
  5. asp.net core文档下载_推荐一个必备的开源项目 (附下载链接)
  6. android 是什么编码格式,在Android的JPG图像编码和解码
  7. Fast Marching on 3D Meshes
  8. 二维标准正态分布的matlab方程
  9. 17复变函数的积分(三)
  10. 【matlab】元胞数组(使用celldisp显示元胞数组)