算法导论9:栈的链表实现 2016.1.9
一直想做一个链表实现的栈,今天终于实现了。确实比数组要难多了,打了很久,很长时间花在了想象上(指针调试比较复杂。。)
但是链表实现有一个最大的好处,就是动态分配内存,所以一般不会出现栈顶溢出的问题。
值得一提的是代码中比昨天的多了一个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相关推荐
- 用一个单链表L实现一个栈(算法导论第十章10.2-2题)
用一个单链表L实现一个栈(算法导论第十章10.2-2题) template<typename T> class HalfNode {public:T key;HalfNode* next; ...
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)
C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...
- 利用链表实现可合并堆(算法导论第三版思考题10-2)
利用链表实现可合并堆(算法导论第三版思考题10-2) a 链表已排序 创建一个空堆: Θ(1) 插入:Θ(n),插入后依然保持排序 最小值:Θ(1),第一位便是 取最小值:Θ(1) 合并:Θ(n),可 ...
- 给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构(算法导论第十章10.4-3)
给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构 (算法导论第十章10.4-3) template<typename T> ...
- Θ(n)反转单链表(算法导论第三版第十章10.2-7)
Θ(n)反转单链表 (算法导论第三版第十章10.2-7) template<typename T> void reverses(Single_L<T> &l) {if( ...
- 用一个单链表L实现一个队列(算法导论第十章10.2-3)
用一个单链表L实现一个队列(算法导论第十章10.2-3) template<typename T> class HalfNode {public:T key;HalfNode* next; ...
- 设单链表中存放n个字符,试设计一个算法,使用栈推断该字符串是否中心对称...
版权声明:本文为博主原创文章.未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/28281631 转载请注明出 ...
- 设计一个算法,借助栈实现单链表链接顺序的逆转
设计一个算法,借助栈实现单链表链接顺序的逆转: 程序思路:题目要求为借助栈将单链表中的数据逆置输出,栈的特点就是先进后出,只 需要将单链表中的数据依次存储在栈中,然后将栈中的元素依次取出即可.关键代码 ...
最新文章
- 怎么去除图像亮度对图像质量评价的影响_图像质量评估指标 SSIM / PSNR / MSE
- 买不起手办就用AI渲染一个!用网上随便搜的图就能合成,已有网友开炒游戏NFT...
- Excel使用控件创建动态地图图表
- Spring的AOP-AspectJ注解方式
- 机器学习在高德起点抓路中的应用实践
- .Net转Java自学之路—基础巩固篇二十(Lambda)
- 爱奇艺、优酷、腾讯独播内容均超70%,如果只能三选一,哪家会员最值得买?
- java数组包含某个值_如何检查Java数组是否包含值?
- 我常用的分页存储过程
- wordpress主题_ripro美化子主题_虎造子主题集成后台美化包v2.0
- MySQL数据库语句
- 笔记本电脑网卡驱动损坏问题
- python编写程序掷骰子游戏规则_通过构建一个简单的掷骰子游戏去学习怎么用Python编程...
- 计算机通信网自学笔记(2)
- 关于 mysql数据库“ERROR 1118 (42000): Row size too large.“ 的解决方法
- Unity SetFromToRotation和FromToRotation的区别
- 我是如何入行嵌入式开发的
- 脚本小子进阶之路(一)用开源武装自己
- D435i安装驱动时遇到的configuring Secure Boot问题
- 推荐一款绝对不能错过的 ORM 框架 dbVisitor,目前版本 4.3.0
热门文章
- 剑指offer面试题[6]-重建二叉树
- springboot mybatisplus 多数据源_【SpringBoot DB 系列】MybatisPlus 多数据源配置
- Python之configparser模块详解和使用
- 可能这就是我应用pytest搭建的第一个测试框架吧
- asp.net core文档下载_推荐一个必备的开源项目 (附下载链接)
- android 是什么编码格式,在Android的JPG图像编码和解码
- Fast Marching on 3D Meshes
- 二维标准正态分布的matlab方程
- 17复变函数的积分(三)
- 【matlab】元胞数组(使用celldisp显示元胞数组)