C++编程思想 第1卷 第4章 嵌套结构

全局名字空间之外为数据和函数取名字的好处可以扩展到结构中
一个结构嵌套在另一个结构中

结构用简单的链表方式实现了一个下推栈,不会越出内存


//: 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值