/**
 * Représente une tour du problème des tours de Hanoï.
 */
public class Tour {
	/** Nombre maximal de disques qu'une tour peut supporter. */
	private static final int MAX = 100;
	/** Disques supportés par la tour (chacun étant désigné par son diamètre). */
	private int[] disques;
	/** Nombre de disques supportés par la tour. */
	private int nb;

	/**
	 * Construit une tour portant <code>nbd</code> disques de diamètres
	 * respectifs <code>nbd</code>, <code>nbd - 1</code>, ..., 1 (de la base au
	 * sommet).
	 * 
	 * @param nbd
	 *            Diamètre du disque se trouvant à la base de la tour.
	 */
	public Tour(int nbd) {
		assert (nbd < MAX);
		disques = new int[MAX];
		nb = 0;
		for (; nbd > 0; --nbd)
			ajouter(nbd);
	}

	/**
	 * Construit une tour vide de tout disque.
	 */
	public Tour() {
		this(0);
	}

	/**
	 * Ajoute un disque de diamètre <code>d</code> au sommet de la tour.
	 * 
	 * @param d
	 *            Diamètre du disque ajouté.
	 */
	public void ajouter(int d) {
		assert (!estPleine() && (estVide() || sommet() > d));
		disques[nb++] = d;
	}

	/**
	 * Retire le disque au sommet de la tour.
	 */
	public void retirer() {
		assert (!estVide());
		--nb;
	}

	/**
	 * Retourne le nombre de disques étant sur la tour.
	 */
	public int nbDisques() {
		return nb;
	}

	/**
	 * Retourne le diamètre du disque se trouvant au sommet de la tour.
	 */
	public int sommet() {
		assert (!estVide());
		return disques[nb - 1];
	}

	/**
	 * Indique si la tour est vide.
	 */
	public boolean estVide() {
		return nb == 0;
	}

	/**
	 * Indique si la tour est pleine.
	 */
	public boolean estPleine() {
		return nb == MAX;
	}

	/**
	 * Retourne une chaîne indiquant le diamètre des disques présents sur la
	 * tour (de la base au sommet).
	 */
	public String toString() {
		StringBuilder sb = new StringBuilder("[");
		for (int i = 0; i < nb; ++i) {
			if (i != 0)
				sb.append(", ");
			sb.append(disques[i]);
		}
		return sb.toString() + "]";
	}
}
