<?php
/**
* 汎用スタッククラス
*
* PHP version 5
*
* @package    core
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class Stack extends Object
{
	private $_data;

	/*
	 *	コンストラクタ
	 */
	public function __construct( Vector $data = NULL )
	{
		parent::__construct();

		$data = $data ? $data : new Vector();

		$this->_data = $data->reverse();
	}

	/*
	 *	先頭の要素を取得
	 */
	public function getHead()
	{
		$cnt = $this->_data->count();
		if ( $cnt > 0 ){
			return $this->_data->getHead();
		}
		_throw( new EmptyStackException( $this ) );
	}

	/*
	 *	最後の要素を取得
	 */
	public function getTail()
	{
		$cnt = $this->_data->count();
		if ( $cnt > 0 ){
			return $this->_data->getTail();
		}
		_throw( new EmptyStackException( $this ) );
	}

	/*
	 *	空か
	 */
	public function isEmpty()
	{
		return $this->_data->isEmpty();
	}

	/*
	 *	要素数を取得
	 */
	public function count()
	{
		return $this->_data->count();
	}

	/*
	 *	全ての要素を削除
	 */
	public function clear()
	{
		$this->_data = new Vector();
	}

	/*
	 *	要素を追加
	 */
	public function push( $item )
	{
		if ( is_null($item) ){
			_throw( new NullPointerException() );
		}
		return $this->_data->add( $item );
	}

	/*
	 *	要素を取得
	 */
	public function pop()
	{
		$tail = $this->_data->removeTail();
		if ( !$tail ){
			_throw( new EmptyStackException( $this ) );
		}
		return $tail;
	}

	/*
	 *	配列化
	 */
	public function toArray()
	{
		return $this->_data->toArray();
	}

	/**
	 *	ダンプ
	 */
	public function dump()
	{
		$this->_data->dump();
	}

}
return __FILE__;
