// $Source: /local/data/cvs/yellowbank/tile/qstack.h,v $
// $Revision: 1.2 $
// $State: Exp $
// $Date: 2004/07/19 03:25:40 $
// $Author: yrp001 $
// $Locker:  $

#if !defined(_QSTACK_H_)
#define _QSTACK_H_

#include <iostream>

template <class atype>
class qstack {

 private:

  struct node {
    atype _value;
    node* _next;
    node( atype v = 0, node* n = 0 ) : _value( v ), _next( n ) {}
  };

 public:

  // constructors and destructor
  qstack() : _top( 0 ) {}
  qstack( const atype& v ) : _top( new node( v ) ) {}
  ~qstack() { deleteall(); }

  // interface
  void push( const atype& v );
  atype pop();
  atype top();
  void deleteall();

 private:

  // data
  node* _top;
};

template <class atype>
atype
qstack<atype>::
pop() {
  if( _top ) {
    node* tn( 0 );
    atype tv = _top->_value;
    if( _top->_next )
      tn = _top->_next;
    delete _top;
    _top = tn;
    return tv;
  }
  return 0;
}

template <class atype>
atype
qstack<atype>::
top() {
  if( _top )
    return _top->_value;
  return 0;
}

template <class atype>
void
qstack<atype>::
push( const atype& v ) {
  _top = new node( v, _top );
}

template <class atype>
void
qstack<atype>::
deleteall() {
  node* t;
  while( _top ) {
    t = _top->_next;
    delete _top;
    _top = t;
  }
}

#endif


