tstack.h

来自「Think in C++ 第二版源码」· C头文件 代码 · 共 86 行

H
86
字号
//: C16:TStack.h

// From Thinking in C++, 2nd Edition

// Available at http://www.BruceEckel.com

// (c) Bruce Eckel 1999

// Copyright notice in Copyright.txt

// Stack using templates

#ifndef TSTACK_H

#define TSTACK_H



// Declaration required:

template<class T> class TStackIterator;



template<class T> class TStack {

  struct Link {

    T* data;

    Link* next;

    Link(T* dat, Link* nxt) {

      data = dat;

      next = nxt;

    }

  }* head;

  int _owns;

public:

  TStack(int own = 1) : head(0), _owns(own) {}

  ~TStack();

  void push(T* dat) {

    head = new Link(dat,head);

  }

  T* peek() const { return head->data; }

  T* pop();

  int owns() const { return _owns; }

  void owns(int newownership) {

    _owns = newownership;

  }

  friend class TStackIterator<T>;

};



template<class T> T* TStack<T>::pop() {

  if(head == 0) return 0;

  T* result = head->data;

  Link* oldHead = head;

  head = head->next;

  delete oldHead;

  return result;

}



template<class T> TStack<T>::~TStack() {

  Link* cursor = head;

  while(head) {

    cursor = cursor->next;

    // Conditional cleanup of data:

    if(_owns) delete head->data;

    delete head;

    head = cursor;

  }

}



template<class T> class TStackIterator {

  TStack<T>::Link* p;

public:

  TStackIterator(const TStack<T>& tl)

    : p(tl.head) {}

  TStackIterator(const TStackIterator& tl)

    : p(tl.p) {}

  // operator++ returns boolean indicating end:

  int operator++() {

    if(p->next)

      p = p->next;

    else p = 0; // Indicates end of list

    return int(p);

  }

  int operator++(int) { return operator++(); }

  // Smart pointer:

  T* operator->() const {

    if(!p) return 0;

    return p->data;

  }

  T* current() const {

    if(!p) return 0;

    return p->data;

  }

  // int conversion for conditional test:

  operator int() const { return p ? 1 : 0; }

};

#endif // TSTACK_H ///:~

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?