[C++] PILE

Résolu/Fermé
Utilisateur anonyme - 17 déc. 2007 à 20:45
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 30 sept. 2015 à 14:13
Bonsoir,

J’ai écrit un programme qui permet d’inverser une pile, pour une pile contenant les valeurs 1,2,3 ; son inversion fournit la pile 3,2,1.

Les méthodes que j’ai définies sont : empiler (ajoute un élément au sommet de la pile), depiler (extrait l’élément se trouvant au sommet de la pile), pile_vide (teste si la pile est vide) et sommet (retourne la valeur du sommet de la pile).

Il n’y a pas d’erreurs au moment de la compilation, mais ma console ne retourne rien :(

Voilà le code (je l’ai écrit dans un seul fichier) :

#include<iostream>
#include"string.h"
using namespace std;

class pile
{
	int *tab;
    int sommet;
    int max;
public :
	void init(int n=10)   //:sommet(0); max(n)
	{
		int sommet=0;
		int max=n;
		tab=new int[max];
	}
	bool em_vide(){return sommet==0;}
	bool em_pleine(){return sommet==max-1;}
	bool empiler(int x)
	{
		if(em_pleine())
			return false;
		else 
			tab[sommet++]=x;
		return true;
	}
	bool depiler(int&x)
	{
		if(em_vide())
			return false;
		else 
			x=tab[--sommet];
		return true;
	}
	void affich()
	{
		for(int i=0; i<=sommet; i++)
	       cout<<tab[i];
	}
};
void main()
{
	pile p;
	p.init(5);
	for(int i=0;i<5;i++)
		p.empiler(i);
	    p.affich();
		int x;
		p.depiler(x);
		cout<<"derniere valeur empilee : "<<x<<endl;
		cout<<"pile = ";
		p.affich();
}


Bonne soirée :)


3 réponses

mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
17 déc. 2007 à 21:17
A titre indicatif la STL fourni déjà une classe de pile :
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583

Evite d'inclure "string.h", prends plutôt le headers C++ : <cstring>. De toute façon ici il ne te sert à rien.
Evite le using namespace std; c'est une mauvaise habitude. Si ça ne pose pas de problème dans un .cpp il ne faut pas l'utiliser dans un .hpp (sinon tous les fichiers qui inclueront ce headers seront "contaminés" par ce using namespace).

Qui dit new dit delete. En particulier tu es sensé libérer tab dans le destructeur de pile (fonction ~pile).
Les else de empiler et depiler sont superflus.
Préfère les unsigned aux int quand l'entier reste positifs.
Pense à préciser "const" quand un paramètre / this est maintenu constant.
Le protected appliqué à tab, max, sommet peut être sous-entendu comme tu l'as fait, mais personnellement je préfère le mettre.
Ton main est sensé retourné un code d'exécution (0 si tout va bien).
Si tu es sous windows pense à rajouter un getchar en fin de programme pour voir ce qui s'affiche sur la console (header <cstdio> au lieu de <stdio.h>).
Je me suis permis de fusionner init et le constructeur.
#include <iostream>
#include <cstdio>

class pile{
    protected:
        int *tab;
        unsigned sommet;
        unsigned max;

    public :
        pile(unsigned n=10):
            tab(NULL),sommet(0),max(n)
        {
            tab = new int[max];
        }

        ~pile(){
            delete tab;
        }

        inline bool em_vide() const {
            return sommet == 0;
        }

        inline bool em_pleine() const {
            return sommet == max-1;
        }

        bool empiler(const int & x){
            if(em_pleine()) return false;
            tab[sommet++]=x;
            return true;
        }

        bool depiler(int & x){
            if(em_vide()) return false;
            x = tab[--sommet];
            return true;
        }

        void affich() const{
            for(unsigned i=0;i<sommet;++i) std::cout << tab[i] << ' ';
        }
};

int main(){
    pile p(5);
    for(unsigned i=0;i<5;++i) p.empiler(i);
    p.affich();
    std::cout << std::endl;
    int x;
    p.depiler(x);
    std::cout << "derniere valeur empilee : " << x << std::endl
              << "pile = ";
    p.affich();
    std::cout << std::endl;
//  getchar(); // decommente cette ligne si tu es sous windows
    return 0;
}

Je sais pas si c'est ce que tu voulais faire mais actuellement cette pile ne permet d'empiler que 4 valeurs :
(mando@aldur) (~) $ g++ -W -Wall plop.cpp
(mando@aldur) (~) $ ./a.out
0 1 2 3
derniere valeur empilee : 3
pile = 0 1 2

Bonne chance
2