1 头文件Stack.h

 #ifndef STACK_H
#define STACK_H struct Stack
{ struct Link
{
void* data;
Link* next;
void initialize(void* dat, Link* nxt);
}* head; void initialize();
void push(void* dat);
void* peek();
void* pop();
void cleanup();
}; #endif // STACK_H

2 实现文件Stack.cpp

 #include "Stack.h"
#include "../require.h" using namespace std; void Stack::Link::initialize(void* dat, Link* nxt)
{
data = dat;
next = nxt;
} void Stack::initialize()
{
head = ;
} void Stack::push(void* dat)
{
Link *newLink = new Link;
newLink->initialize(dat, head);
head = newLink;
} void* Stack::peek()
{
require(head !=, "Stack empty");
return head->data;
} void* Stack::pop()
{
if (head == )
return ;
void* result = head->data;
Link* oldHead = head;
head = head->next;
delete oldHead;
return result;
} void Stack::cleanup()
{
require(head == , "Stack not empty");
}

3 测试文件main.cpp

 #include <iostream>
#include <fstream>
#include <string>
#include "Stack.h"
#include "../require.h" using namespace std; int main(int argc, char* argv[])
{ requireArgs(argc, ); ifstream in(argv[]);
assure(in, argv[]); Stack textLines;
textLines.initialize(); string line;
while (getline(in, line)) //文件以行为单位入栈
textLines.push(new string(line)); string* s;
while ((s = (string*) textLines.pop()) != ) //出栈
{
cout << *s << endl;
delete s;
} textLines.cleanup();
return ;
}

4 运行分析

附 辅助测试工具require.h

 #ifndef REQUIRE_H
#define REQUIRE_H #include <cstdio>
#include <cstdlib>
#include <fstream>
#include <string> inline void require(bool requirement, const std::string& msg = "Requirement failed")
{
using namespace std;
if (!requirement)
{
fputs(msg.c_str(), stderr);
fputs("\n", stderr);
exit();
}
} inline void requireArgs(int argc, int args, const std::string& msg = "Must use %d arguments")
{
using namespace std;
if (argc != args + )
{
fprintf(stderr, msg.c_str(), args);
fputs("\n", stderr);
exit();
}
} inline void requireMinArgs(int argc, int minArgs, const std::string& msg ="Must use at least %d arguments")
{
using namespace std;
if(argc < minArgs + )
{
fprintf(stderr, msg.c_str(), minArgs);
fputs("\n", stderr);
exit();
}
} inline void assure(std::ifstream& in, const std::string& filename = "")
{
using namespace std;
if(!in)
{
fprintf(stderr, "Could not open file %s\n",
filename.c_str());
exit();
}
} inline void assure(std::ofstream& out, const std::string& filename = "")
{
using namespace std;
if(!out) {
fprintf(stderr, "Could not open file %s\n",
filename.c_str());
exit();
}
} #endif // REQUIRE_H

下推栈实现(c++编程思想 p136)的更多相关文章

  1. 用一维数组实现栈(C++编程思想 p120)

    1 实现思路 向栈中插入4个元素后的状态 执行过程分析: 2 代码实现 clib.h 接口定义 typedef struct CStashTag { int ele_size; //栈中每个元素的占用 ...

  2. 小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework

    小马哥出手的Spring栈核心编程思想课程,可以说是非常专业和权威的Spring课程.课程主要的方向与核心是Spring Framework总览,带领同学们重新认识重新认识IoC,Spring IoC ...

  3. Java编程思想——初始化与清理

    PS:最近一直忙于项目开发..所以一直没有写博客..趁着空闲期间来一发.. 学习内容: 1.初始化 2.清理 1.初始化   虽然自己的Java基础还是比较良好的..但是在解读编程思想的时候还是发现了 ...

  4. Java程序员的日常——《编程思想》一切都是对象

    今天终于看完了第一章,哈哈,万事开头难....刚开始被编程思想的第一章给蒙住了,讲一堆理论,没什么意思.从第二章开始,真正的开始讲解Java相关的内容,有了一定的开发经验后,再次阅读起来,感觉收获良多 ...

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

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

  6. Java编程思想(11~17)

    [注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第十一章 持有对象 11.1 泛型和类型安全的容器>eg: List<St ...

  7. 重读JAVA编程思想

    当年如猪八戒吃人生果般的读了java编程思想,只是知道这是本好书,但是具体细节,真是不知所云,很多都是工作中用到哪些,然后就翻<think in java >和<core java& ...

  8. c++编程思想(一)--对象导言

    回过头来看c++编程思想第一章,虽然只是对c++知识的一个总结,并没有实质性知识点,但是收获还是蛮多的! 下面感觉是让自己茅塞顿开的说法,虽然含义并不是很准确,但是很形象(自己的语言): 1.类描述了 ...

  9. Java编程思想读书笔记(一)【对象导论】

    2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...

随机推荐

  1. LintCode_173 链表插入排序

    题目 用插入排序对链表排序 样例 Given 1->3->2->0->null, return 0->1->2->3->null C++代码 ListN ...

  2. PHPCMS 按点击量排序

    {pc:content action="hits" catid="12" num="4" order="views DESC&qu ...

  3. GBRT(GBDT)(MART)(Tree Net)(Tree link)

    源于博客 GBRT(梯度提升回归树)有好多名字,标题全是它的别名. 它是一种迭代的回归树算法,由多棵回归树组成,所有树的结论累加起来得到最终结果.在被提出之初与SVM一起被认为是泛化能力较强的算法. ...

  4. 【时光回溯】【JZOJ3566】【GDKOI2014】阶乘

    题目描述 输入 第一行有一个正整数T,表示测试数据的组数. 接下来的T行,每行输入两个十进制整数n和base. 输出 对于每组数据,输出一个十进制整数,表示在base进制下,n!结尾的零的个数. 样例 ...

  5. NSArray 查询数组中的对象

    1.NSString 对象 NSArray  *array =@["123", @"234" , @"345"]; NSPredicate ...

  6. ImmutableMap不可使用null的问题

    示例 在项目中有发现类似下方的代码, Map tmpParams = ImmutableMap.of( "extraInfos", ext.get("extraInfos ...

  7. 【风马一族_php】PHP运算

    运算 算术运算符 <?php //加法 $num1 = 10; $num2 = 43; echo $num1 + $num2; echo " "; var_dump($num ...

  8. python系列之(2)PyQuery的用法

      1.了解 pyquery库是jQuery的Python实现,能够以jQuery的语法来操作解析 HTML 文档,易用性和解析速度都很好. 2.安装 pip install pyquery 3引用 ...

  9. X-editable 不能二次初始化的问题解决方案

    最近用到了 X-editable 可编辑表格插件,发现了一个头疼的问题,X-editable 不能对同一个 <a> 元素二次初始化. 如下代码举例:在页面加载完成时,用“数组1”填充一个下 ...

  10. SQLServer —— 用户权限操作

    说明 以下操作都是基于SQLServer登陆验证方式登陆.而且操作员都是 sa. 一.添加登陆账号 use master go ' 第一个(xu)是登陆名,第二个(123456)是登陆密码. 执行语句 ...