Pile c++

Résolu/Fermé
javast Messages postés 75 Date d'inscription mardi 20 avril 2010 Statut Membre Dernière intervention 14 février 2013 - 13 déc. 2011 à 10:44
javast Messages postés 75 Date d'inscription mardi 20 avril 2010 Statut Membre Dernière intervention 14 février 2013 - 10 févr. 2012 à 21:07
Bonjour je débute avec c++, je dois réaliser un une pile en c++, j'ai déjà fais ça en java mais en c++ j'arrive pas je le bloque dès le debut

class Pile
{
public:
Pile(int n);// pile vide de n element
Pile(const Pile& s);//pile identique à s
Pile operator +(const Pile& s);
int push(int e);
int rechercher(int e);

private :
int* conteneur;
int size;
int currentElt;

};


voilà ce que j'ai dans un premier temps
Pile::Pile(int n)
{
size=n;
currentElt=0;
conteneur=new int(n);
}

sinon je bloque sur les autres méthodes, si quelqu'un peut m'aider :(

2 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
13 déc. 2011 à 11:36
Salut
Le problème du C++ c'est la gestion de la mémoire. Soit tu fais des listes chainées, ça évite de gérer la mémoire, mais ça prend de la place mémoire, pour un type intégrale, mais s'avère utile pour des objets volumineux.
Le parti prit de faire un tableau est bien mais nécessite de gérer la mémoire. En général ce qui est fait c'est de dimensionner trop grand, car si tu doit redimensionner ton tableau à chaque nouvel élément, tu perds du temps en copie (et oui, ce n'est pas possible d'étendre un tableau).

Mais sinon tu es bien parti. Je te conseil donc d'avoir 2 variables : une variable size qui est la taille réelle du tableau et une variable lenght qui est le nombre de données dans la pile. Ensuite, à chaque fois qui tu ajoutes un élément tu vérifies les deux tailles, et si tu manques de place tu fait un tableau plus grand et tu copies tes donner dedans avant de détruire le premier.
0
javast Messages postés 75 Date d'inscription mardi 20 avril 2010 Statut Membre Dernière intervention 14 février 2013 1
13 déc. 2011 à 17:18
Merci bcp pour ton aide, mais je dois le faire en c++ donc si tu peux m'ainder à implementer les autres méthode
Pile::Pile(int n)
{
size=n;
currentElt=0;
conteneur=new int(n);
}
Pile::Pile(const Pile& n)
{
//aucune idée :(
}
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
13 déc. 2011 à 23:10
Pour le constructeur de copie(Pile::Pile(const Pile& n) ), c'est simple,il faut dimensionner correctement ta pile en fonction de celle passée en argument (type constructeur par défaut) et ensuite la remplir avec les données
0
javast Messages postés 75 Date d'inscription mardi 20 avril 2010 Statut Membre Dernière intervention 14 février 2013 1
7 févr. 2012 à 18:30
Voilà ce que j'ai fais pour le constructeur par copie
Pile::Pile(const Pile& n)
{
size=n.size;
currentElt=n.currentElt;

for(int i=0;i<n.currentElt;i++)
{
conteneur[i]=n.conteneur[i];
}

}
ca compile, j'ai pas encore fais un main, si tu peux m'aider pour faire push
cette dernière doit empiler e et renvoyer son index


Merci
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
8 févr. 2012 à 08:26
il manque un new pour dimensionner "conteneur".
0
javast Messages postés 75 Date d'inscription mardi 20 avril 2010 Statut Membre Dernière intervention 14 février 2013 1
8 févr. 2012 à 18:11
conteneur=new conteneur[n.size)? c est bien ça non?
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
9 févr. 2012 à 21:08
essai "Pile s2(s1);"
C'est erreur est vraiment étrange. Je ne l'ai jamais vu. Ça ressemble à une erreur système, mais tes variables ont vraiment trop petites pour générer de telles erreurs.
Es tu sur que s.size>0 ? affiche pour vérifier. Ça semble crétin comme remarque, mais à part ça, je ne vois pas ce qui pourrait générer une erreur dans malloc. À tout hasard, met ta fonction push.
0
javast Messages postés 75 Date d'inscription mardi 20 avril 2010 Statut Membre Dernière intervention 14 février 2013 1
9 févr. 2012 à 21:34
j'ai déjà essayer Pile s2(s1) au début, sans aucun chagement
voilà exactement ce je fais dans mon main

#include "Pile.cpp"

using namespace std;

int main()
{
Pile s1(4);
s1.push(3);
s1.push(5);
s1.push(7);
s1.push(9);

//Pile s2=s1; // là j'ai une erreur
for(int i=0;i<s1.size; i++)
{
cout << s1.conteneur[i] <<endl; //affiche le contenu de la pile


}

return 1;
}


fonction push

int Pile::push(int e)
{
int a=0;
if(currentElt<size)
{

conteneur[current]=e;
a=currentElt;
currentElt++;

}
else{
cout << "la Pile est pleine le " << e << " n est pas inserer"<< endl;
a= -1;
}
return a;
}

Constructeur

Pile::Pile(int n)
{
currentElt=0;
size=n;
conteneur=new int[0];
}
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
10 févr. 2012 à 08:15
Houlà ! c'est quoi ce constructeur. C'est bien une chance que tu n'ais pas d'erreur ! Pourquoi l'avoir modifier, le premier constructeur était bon.
conteneur=new int[0];
un tableau de 0 c'est con tout de même.
0
javast Messages postés 75 Date d'inscription mardi 20 avril 2010 Statut Membre Dernière intervention 14 février 2013 1
10 févr. 2012 à 09:48
non au fait c'est que j'avais des erreurs dans le constructeur, maintenant c'est bon, enlève les []
Pile::Pile(int n)
{
currentElt=-1;
size=n;
conteneur=new int(0);
}


int Pile::push(int e)
{
int a=0;
if(currentElt>=size-1)
{
cout << " Pile pleine"<< endl;

}
else{
currentElt++;
conteneur[current]=e;
a=currentElt;

}
return a;
}
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
10 févr. 2012 à 10:20
non, a bonne façon de faire c'est :
conteneur=new int[n];
sinon tu définis juste une case que tu affectes à 0. C'est en gros équivalent à
new int(0)[1]
0
javast Messages postés 75 Date d'inscription mardi 20 avril 2010 Statut Membre Dernière intervention 14 février 2013 1
10 févr. 2012 à 11:11
c'est bon ça marche, mrc
par contre j'ai toujour le même problème au niveau du constructeur par copie :(

Merci bcp
0