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. jquery购物评分

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 批量删除maven lastUpdated

    批量删除lastUpdated for /r %i in (*.lastUpdated) do del %i 安装jar到本地仓库 mvn install:install-file -Dfile=D: ...

  3. Location 位置 history

    拆分出来地址  让地址各归其位 search案例 查找历史记录跳转

  4. MSSQL → 01:SQLServer 2008概述及安装

    据库的发展史 在人类诞生以来,就有记录数据的需求,在远古时代就有了结绳记事的故事,而随着科技的进步,我们记录数据的方式也发生了天翻地覆的变化,从效率低.规模小.不能适应信息高速发展的需要的手工或者简单 ...

  5. js简单倒计时

    不想每次用倒计时,都现写代码,比较烦,这里记一下,也顺便分享一些倒计时简单的逻辑. 如果你有更简单方便的代码,可以分享给大家. var method = { countdownObj: { timer ...

  6. ActivityManagerService

    先上类图: 基本类说明和运行框架图中蓝色表示AMS进程,黄色表示app进程.1. 全局调度者在android中,AMS是activity和进程的全局调度者,也就是说系统中载入和准备载入的activit ...

  7. linux之架构图和八台服务器

    (1) (2)

  8. iOS 万能跳转界面方法 (runtime实用篇一)

    http://www.cocoachina.com/ios/20150824/13104.html 作者:汉斯哈哈哈 授权本站转载. 在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来的数据 ...

  9. APP上线前,如何做运营推广工作?

    http://www.cocoachina.com/market/20150723/12731.html 一 竞品分析 1.选择竞品,做好定位(选择两个产品最好,最多三个). 如何获取竞品? A 百度 ...

  10. aspcms安装所遇到的问题

     aspcms标签:http://biaoqian.iasp.com.cn/ 1.报错:An error occurred on the server when processing the URL. ...