下推栈实现(c++编程思想 p136)
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)的更多相关文章
- 用一维数组实现栈(C++编程思想 p120)
1 实现思路 向栈中插入4个元素后的状态 执行过程分析: 2 代码实现 clib.h 接口定义 typedef struct CStashTag { int ele_size; //栈中每个元素的占用 ...
- 小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework
小马哥出手的Spring栈核心编程思想课程,可以说是非常专业和权威的Spring课程.课程主要的方向与核心是Spring Framework总览,带领同学们重新认识重新认识IoC,Spring IoC ...
- Java编程思想——初始化与清理
PS:最近一直忙于项目开发..所以一直没有写博客..趁着空闲期间来一发.. 学习内容: 1.初始化 2.清理 1.初始化 虽然自己的Java基础还是比较良好的..但是在解读编程思想的时候还是发现了 ...
- Java程序员的日常——《编程思想》一切都是对象
今天终于看完了第一章,哈哈,万事开头难....刚开始被编程思想的第一章给蒙住了,讲一堆理论,没什么意思.从第二章开始,真正的开始讲解Java相关的内容,有了一定的开发经验后,再次阅读起来,感觉收获良多 ...
- C++编程思想重点笔记(下)
上篇请看:C++编程思想重点笔记(上) 宏的好处与坏处 宏的好处:#与##的使用 三个有用的特征:字符串定义.字符串串联和标志粘贴. 字符串定义的完成是用#指示,它容许设一个标识符并把它转化为字符串, ...
- Java编程思想(11~17)
[注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第十一章 持有对象 11.1 泛型和类型安全的容器>eg: List<St ...
- 重读JAVA编程思想
当年如猪八戒吃人生果般的读了java编程思想,只是知道这是本好书,但是具体细节,真是不知所云,很多都是工作中用到哪些,然后就翻<think in java >和<core java& ...
- c++编程思想(一)--对象导言
回过头来看c++编程思想第一章,虽然只是对c++知识的一个总结,并没有实质性知识点,但是收获还是蛮多的! 下面感觉是让自己茅塞顿开的说法,虽然含义并不是很准确,但是很形象(自己的语言): 1.类描述了 ...
- Java编程思想读书笔记(一)【对象导论】
2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...
随机推荐
- jquery购物评分
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 批量删除maven lastUpdated
批量删除lastUpdated for /r %i in (*.lastUpdated) do del %i 安装jar到本地仓库 mvn install:install-file -Dfile=D: ...
- Location 位置 history
拆分出来地址 让地址各归其位 search案例 查找历史记录跳转
- MSSQL → 01:SQLServer 2008概述及安装
据库的发展史 在人类诞生以来,就有记录数据的需求,在远古时代就有了结绳记事的故事,而随着科技的进步,我们记录数据的方式也发生了天翻地覆的变化,从效率低.规模小.不能适应信息高速发展的需要的手工或者简单 ...
- js简单倒计时
不想每次用倒计时,都现写代码,比较烦,这里记一下,也顺便分享一些倒计时简单的逻辑. 如果你有更简单方便的代码,可以分享给大家. var method = { countdownObj: { timer ...
- ActivityManagerService
先上类图: 基本类说明和运行框架图中蓝色表示AMS进程,黄色表示app进程.1. 全局调度者在android中,AMS是activity和进程的全局调度者,也就是说系统中载入和准备载入的activit ...
- linux之架构图和八台服务器
(1) (2)
- iOS 万能跳转界面方法 (runtime实用篇一)
http://www.cocoachina.com/ios/20150824/13104.html 作者:汉斯哈哈哈 授权本站转载. 在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来的数据 ...
- APP上线前,如何做运营推广工作?
http://www.cocoachina.com/market/20150723/12731.html 一 竞品分析 1.选择竞品,做好定位(选择两个产品最好,最多三个). 如何获取竞品? A 百度 ...
- aspcms安装所遇到的问题
aspcms标签:http://biaoqian.iasp.com.cn/ 1.报错:An error occurred on the server when processing the URL. ...