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)相关推荐

  1. 小马哥spring编程核心思想_求小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework教程...

    这次搜集了下小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework,最强Spring全面核心实战的视频教程,有需要的朋友可以自行下载学习. 课程简介: 小马哥出手的Sp ...

  2. 几种常用编程语言的编程思想和方法 转

    搞软件的人,编程语言的掌握是基本功,如果单单是学习语法,最慢的一周之内也应该可以搞定(个人认为 语法层面c++是最复杂的).不幸的是,软件的本质是逻辑,解决方案的设计是要借助某种解决问题或编程的思想的 ...

  3. java编程思想 入门_java编程思想学习(基础)

    第一章 java介绍 1.编程的本质: 机器空间:解空间 问题空间:实际需要解决的业务问题,将该问题抽象化,在解空间中对问题建模. 编程就是建立问题空间和机器空间中的关联 面向对象编程思想: 1.万物 ...

  4. C++编程思想重点笔记(下)

    上篇请看:C++编程思想重点笔记(上) 宏的好处与坏处 宏的好处:#与##的使用 三个有用的特征:字符串定义.字符串串联和标志粘贴. 字符串定义的完成是用#指示,它容许设一个标识符并把它转化为字符串, ...

  5. 天正建筑lisp编程接口_编程思想|面向过程的结构化、面向对象的抽象化、泛型编程...

    程序总是因而解决问题而生,如何组合描述数据.算法的模块,就形成了各种编程思路的分类. 1 控制结构语句产生之前 20世纪60年代初,在提倡通过规则让读写程序更轻松的时代潮流中,结构化程序设计应运而生. ...

  6. Java编程思想学习笔记-第11章

    <?xml version="1.0" encoding="utf-8"?> Java编程思想学习笔记-第11章 Java编程思想学习笔记-第11章 ...

  7. python递归 及 面向对象初识及编程思想

    递归 及 面向对象初识及编程思想 一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递归策 ...

  8. python中的递归思想_〖Python〗-- 递归、面向对象初识及编程思想

    [递归.面向对象初识及编程思想] 一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递归策 ...

  9. Android知识架构 · Java的编程思想

    1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注这些 ...

最新文章

  1. 这个插件竟打通了Python和Excel,还能自动生成代码!
  2. Genymotion模拟器的安装及常见问题解决方法
  3. Java8--Lambda表达式对List集合操作
  4. 第二届「机器智能前沿论坛」强势来袭,众多机器学习大咖邀你共话AI未来!
  5. Hibernate基础学习(二)—Hibernate相关API介绍
  6. 数据说话,88000条数据绘制北京市地图
  7. PostgreSQL增强版命令行客户端(pgcli)
  8. bootstrap设计登录页面_前端小白如何在10分钟内打造一个爆款Web响应式登录界面?...
  9. VR/AR平台战略与实践(1)
  10. 停课不停学,大型网课直播翻车现场,你别笑,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈啊哈...
  11. html怎么把字转换为行内元素,什么是行内元素?
  12. c语言第六章谭浩强ppt,谭浩强C语言课件第6章.ppt
  13. 解析IEC 61850通信规约
  14. 二开要饭网免费开源源码
  15. python 螺旋_用Python生成气候温度螺旋
  16. 专利代理人资格考试怎么准备
  17. 桌面图标有蓝底怎么去掉方法
  18. php怎么分栏,WordPress CMS分栏制作详解
  19. 【首次起用黑人模特的Prada】
  20. Python OpenCV3 计算机视觉秘籍:1~5

热门文章

  1. 推荐:CLR 完全介绍-一篇讲解CLR内存回收机制以及常见的调试技巧的文章
  2. MySql应用原理分析系列文章目录
  3. Flutter 随机颜色 颜色处理工具类
  4. Flutter中富文件标签的解决方案
  5. Android中的savedInstanceState
  6. 配置Ubuntu系统环境变量
  7. JAVA maven Spring 开发 webservice 步骤
  8. HTML 中CSS 图像详解
  9. 微信小程序之wx.request:fail错误,真机预览请求无效问题解决,安卓,ios网络预览异常(转)...
  10. 浦发银行出现:部件'InstallCertListAx.ocx'或其附件之一不能正确注册:一个文件丢失 解决...