C++编程思想 第1卷 第16章 模板介绍 容器

假定想创建一个,为了简单,这个栈只存放int类型的值

//: C16:IntStack.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Simple integer stack
//{L} fibonacci
#include "fibonacci.h"
#include "../require.h"
#include <iostream>
using namespace std;

class IntStack {
  enum { ssize = 100 };
  int stack[ssize];
  int top;
public:
  IntStack() : top(0) {}
  void push(int i) {
    require(top < ssize, "Too many push()es");
    stack[top++] = i;
  }
  int pop() {
    require(top > 0, "Too many pop()s");
    return stack[--top];
  }
};

int main() {
  IntStack is;
  // Add some Fibonacci numbers, for interest:
  for(int i = 0; i < 20; i++)
    is.push(fibonacci(i));
  // Pop & print them:
  for(int k = 0; k < 20; k++)
    cout << is.pop() << endl;
  getchar();
} ///:~

类IntStack是最为常见的下堆栈的例子。为了简化,此处栈的尺寸是固定的,
但是可以对其修改,使得它能通过在堆中分配内存而自动扩展

main()向这个栈添加一些整数,然后弹出它们。
整数用fibonacci()函数生成, 它生成传统兔子的繁殖数

//: C16:fibonacci.h
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Fibonacci number generator
int fibonacci(int n); ///:~

实现

//: C16:fibonacci.cpp {O}
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
#include "../require.h"

int fibonacci(int n) {
  const int sz = 100;
  require(n < sz);
  static int f[sz]; // Initialized to zero
  f[0] = f[1] = 1;
  // Scan for unfilled array elements:
  int i;
  for(i = 0; i < sz; i++)
    if(f[i] == 0) break;
  while(i <= n) {
    f[i] = f[i-1] + f[i-2];
    i++;
  }
  return f[n];
} ///:~

这是一个相当有效的实现,因为它绝不会多次生成这些数

输出
6765
4181
2584
1597
987
610
377
233
144
89
55
34
21
13
8
5
3
2
1
1

猜你喜欢

转载自blog.csdn.net/eyetired/article/details/81408224