一个结构嵌套在另一个结构中
结构用简单的链表方式实现了一个下推栈,不会越出内存
//: C04:Stack.h
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Nested struct in linked list
#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 ///:~
嵌套struct称为Link,包含指向表中的下一个Link的指针和一个指向存放在link中数据的指针
有自己的 initialize()函数 cleanup()函数 push()函数
pop()函数 返回栈顶的data指针去除栈顶元素
成员函数的定义
//: C04:Stack.cpp {O}
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Linked list with nesting
#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 = 0; }
void Stack::push(void* dat) {
Link* newLink = new Link;
newLink->initialize(dat, head);
head = newLink;
}
void* Stack::peek() {
require(head != 0, "Stack empty");
return head->data;
}
void* Stack::pop() {
if(head == 0) return 0;
void* result = head->data;
Link* oldHead = head;
head = head->next;
delete oldHead;
return result;
}
void Stack::cleanup() {
require(head == 0, "Stack not empty");
} ///:~
stack::link::initialize()函数参数并把参数赋给它们的成员
实际上cleanup不做任何清除工作
stack存放的事void指针
//: C04:StackTest.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
//{L} Stack
//{T} StackTest.cpp
// Test of nested linked list
#include "Stack.h"
#include "../require.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[]) {
requireArgs(argc, 1); // File name is argument
ifstream in(argv[1]);
assure(in, argv[1]);
Stack textlines;
textlines.initialize();
string line;
// Read file and store lines in the Stack:
while(getline(in, line))
textlines.push(new string(line));
// Pop the lines from the Stack and print them:
string* s;
while((s = (string*)textlines.pop()) != 0) {
cout << *s << endl;
delete s;
}
textlines.cleanup();
getchar();
} ///:~
来自文件的行存放到Stack中,然后弹出它们
文件逆序打印出来
填充textlines时,通过建立new string(ling)为每个Push() 复制 line的内容
文件名取自命令行。 看requre.h 头文件第二个函数 requireArgs()
比较argc和期望的参数个数,如果没有足够的参数,打印错误信息并退出
输入 一个文本文件的路径 完全路径,这里是stack.h
输出
#endif // STACK_H ///:~
};
void cleanup();
void* pop();
void* peek();
void push(void* dat);
void initialize();
}* head;
void initialize(void* dat, Link* nxt);
Link* next;
void* data;
struct Link {
struct Stack {
#define STACK_H
#ifndef STACK_H
// Nested struct in linked list
// Copyright notice in Copyright.txt
// (c) Bruce Eckel 2000
// Available at http://www.BruceEckel.com
// From Thinking in C++, 2nd Edition
//: C04:Stack.h