下推栈实现(c++编程思想 p136)
1 头文件Stack.h
1 #ifndef STACK_H 2 #define STACK_H 3 4 struct Stack 5 { 6 7 struct Link 8 { 9 void* data; 10 Link* next; 11 void initialize(void* dat, Link* nxt); 12 }* head; 13 14 void initialize(); 15 void push(void* dat); 16 void* peek(); 17 void* pop(); 18 void cleanup(); 19 }; 20 21 #endif // STACK_H
2 实现文件Stack.cpp
1 #include "Stack.h" 2 #include "../require.h" 3 4 using namespace std; 5 6 void Stack::Link::initialize(void* dat, Link* nxt) 7 { 8 data = dat; 9 next = nxt; 10 } 11 12 void Stack::initialize() 13 { 14 head = 0; 15 } 16 17 void Stack::push(void* dat) 18 { 19 Link *newLink = new Link; 20 newLink->initialize(dat, head); 21 head = newLink; 22 } 23 24 void* Stack::peek() 25 { 26 require(head !=0, "Stack empty"); 27 return head->data; 28 } 29 30 31 void* Stack::pop() 32 { 33 if (head == 0) 34 return 0; 35 void* result = head->data; 36 Link* oldHead = head; 37 head = head->next; 38 delete oldHead; 39 return result; 40 } 41 42 43 void Stack::cleanup() 44 { 45 require(head == 0, "Stack not empty"); 46 }
3 测试文件main.cpp
1 #include <iostream> 2 #include <fstream> 3 #include <string> 4 #include "Stack.h" 5 #include "../require.h" 6 7 using namespace std; 8 9 int main(int argc, char* argv[]) 10 { 11 12 requireArgs(argc, 1); 13 14 ifstream in(argv[1]); 15 assure(in, argv[1]); 16 17 Stack textLines; 18 textLines.initialize(); 19 20 string line; 21 while (getline(in, line)) //文件以行为单位入栈 22 textLines.push(new string(line)); 23 24 string* s; 25 while ((s = (string*) textLines.pop()) != 0) //出栈 26 { 27 cout << *s << endl; 28 delete s; 29 } 30 31 textLines.cleanup(); 32 return 0; 33 }
4 运行分析
附 辅助测试工具require.h
1 #ifndef REQUIRE_H 2 #define REQUIRE_H 3 4 #include <cstdio> 5 #include <cstdlib> 6 #include <fstream> 7 #include <string> 8 9 inline void require(bool requirement, const std::string& msg = "Requirement failed") 10 { 11 using namespace std; 12 if (!requirement) 13 { 14 fputs(msg.c_str(), stderr); 15 fputs("\n", stderr); 16 exit(1); 17 } 18 } 19 20 inline void requireArgs(int argc, int args, const std::string& msg = "Must use %d arguments") 21 { 22 using namespace std; 23 if (argc != args + 1) 24 { 25 fprintf(stderr, msg.c_str(), args); 26 fputs("\n", stderr); 27 exit(1); 28 } 29 } 30 31 inline void requireMinArgs(int argc, int minArgs, const std::string& msg ="Must use at least %d arguments") 32 { 33 using namespace std; 34 if(argc < minArgs + 1) 35 { 36 fprintf(stderr, msg.c_str(), minArgs); 37 fputs("\n", stderr); 38 exit(1); 39 } 40 } 41 42 inline void assure(std::ifstream& in, const std::string& filename = "") 43 { 44 using namespace std; 45 if(!in) 46 { 47 fprintf(stderr, "Could not open file %s\n", 48 filename.c_str()); 49 exit(1); 50 } 51 } 52 53 inline void assure(std::ofstream& out, const std::string& filename = "") 54 { 55 using namespace std; 56 if(!out) { 57 fprintf(stderr, "Could not open file %s\n", 58 filename.c_str()); 59 exit(1); 60 } 61 } 62 63 64 #endif // REQUIRE_H
转载于:https://www.cnblogs.com/asnjudy/p/4561032.html
下推栈实现(c++编程思想 p136)相关推荐
- 小马哥spring编程核心思想_求小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework教程...
这次搜集了下小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework,最强Spring全面核心实战的视频教程,有需要的朋友可以自行下载学习. 课程简介: 小马哥出手的Sp ...
- 几种常用编程语言的编程思想和方法 转
搞软件的人,编程语言的掌握是基本功,如果单单是学习语法,最慢的一周之内也应该可以搞定(个人认为 语法层面c++是最复杂的).不幸的是,软件的本质是逻辑,解决方案的设计是要借助某种解决问题或编程的思想的 ...
- java编程思想 入门_java编程思想学习(基础)
第一章 java介绍 1.编程的本质: 机器空间:解空间 问题空间:实际需要解决的业务问题,将该问题抽象化,在解空间中对问题建模. 编程就是建立问题空间和机器空间中的关联 面向对象编程思想: 1.万物 ...
- C++编程思想重点笔记(下)
上篇请看:C++编程思想重点笔记(上) 宏的好处与坏处 宏的好处:#与##的使用 三个有用的特征:字符串定义.字符串串联和标志粘贴. 字符串定义的完成是用#指示,它容许设一个标识符并把它转化为字符串, ...
- 天正建筑lisp编程接口_编程思想|面向过程的结构化、面向对象的抽象化、泛型编程...
程序总是因而解决问题而生,如何组合描述数据.算法的模块,就形成了各种编程思路的分类. 1 控制结构语句产生之前 20世纪60年代初,在提倡通过规则让读写程序更轻松的时代潮流中,结构化程序设计应运而生. ...
- Java编程思想学习笔记-第11章
<?xml version="1.0" encoding="utf-8"?> Java编程思想学习笔记-第11章 Java编程思想学习笔记-第11章 ...
- python递归 及 面向对象初识及编程思想
递归 及 面向对象初识及编程思想 一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递归策 ...
- python中的递归思想_〖Python〗-- 递归、面向对象初识及编程思想
[递归.面向对象初识及编程思想] 一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递归策 ...
- Android知识架构 · Java的编程思想
1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注这些 ...
最新文章
- 这个插件竟打通了Python和Excel,还能自动生成代码!
- Genymotion模拟器的安装及常见问题解决方法
- Java8--Lambda表达式对List集合操作
- 第二届「机器智能前沿论坛」强势来袭,众多机器学习大咖邀你共话AI未来!
- Hibernate基础学习(二)—Hibernate相关API介绍
- 数据说话,88000条数据绘制北京市地图
- PostgreSQL增强版命令行客户端(pgcli)
- bootstrap设计登录页面_前端小白如何在10分钟内打造一个爆款Web响应式登录界面?...
- VR/AR平台战略与实践(1)
- 停课不停学,大型网课直播翻车现场,你别笑,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈啊哈...
- html怎么把字转换为行内元素,什么是行内元素?
- c语言第六章谭浩强ppt,谭浩强C语言课件第6章.ppt
- 解析IEC 61850通信规约
- 二开要饭网免费开源源码
- python 螺旋_用Python生成气候温度螺旋
- 专利代理人资格考试怎么准备
- 桌面图标有蓝底怎么去掉方法
- php怎么分栏,WordPress CMS分栏制作详解
- 【首次起用黑人模特的Prada】
- Python OpenCV3 计算机视觉秘籍:1~5
热门文章
- 推荐:CLR 完全介绍-一篇讲解CLR内存回收机制以及常见的调试技巧的文章
- MySql应用原理分析系列文章目录
- Flutter 随机颜色 颜色处理工具类
- Flutter中富文件标签的解决方案
- Android中的savedInstanceState
- 配置Ubuntu系统环境变量
- JAVA maven Spring 开发 webservice 步骤
- HTML 中CSS 图像详解
- 微信小程序之wx.request:fail错误,真机预览请求无效问题解决,安卓,ios网络预览异常(转)...
- 浦发银行出现:部件'InstallCertListAx.ocx'或其附件之一不能正确注册:一个文件丢失 解决...