/* Classe PileCar : Pile des caractères Exemple sur destructeur et constructeur de recopie Ce programme permet de tester, en utilisant la gestion d'une pile, si 3 chaînes de caractères sont des palindrômes (en ne tenant compte que de lettres, sans distinguer la casse (Majuscule vs minuscule), on a la même lecture à l'envers (exemple Laval). Préparé par LVN pour IFT 1166 */ #include #include #include using namespace std; const int BORNE = 200 ; // 200 éléments au maximum class PileCar { private : char * sommet; // champ de type pointeur int Max_Elem; int indiceSommet; public : PileCar(); // construire une pile contenant "maxi" entiers PileCar(int maxi); // constructeur de recopie PileCar(const PileCar &); // destructeur (1 SEUL) : le but est de libérer la mémoire ~PileCar(); void empiler(char valeur); // Empiler char depiler(); // Dépiler char valSommet(); // Consulter la valeur au sommet bool estVide () const; void afficher(string = ""); friend ostream& operator << (ostream&, const PileCar&); char get(int) const; int getNbElem() const; }; // au maximum 200 caracteres PileCar::PileCar() { Max_Elem = BORNE; sommet = new char[Max_Elem]; indiceSommet = 0; } PileCar::PileCar(int maxi){ sommet = new char[Max_Elem = maxi]; indiceSommet = 0; } // constructeur de recopie PileCar::PileCar(const PileCar & autre){ sommet = new char[Max_Elem = autre.Max_Elem]; indiceSommet = autre.indiceSommet; for (int i = 0; i < indiceSommet; i++) sommet[i] = autre.sommet[i]; } // liberer l'espace memoire reservee PileCar::~PileCar() { delete[] sommet; } int PileCar::getNbElem() const{ return indiceSommet; } void PileCar::empiler(char valeur) { sommet[indiceSommet++] = valeur; } char PileCar::depiler() { return sommet[--indiceSommet]; } char PileCar::valSommet() { return sommet[indiceSommet-1]; } bool PileCar::estVide() const { return indiceSommet == 0; } void PileCar::afficher(string mess) { cout << "Contenu de la pile " << mess << " :\n"; if (estVide()) cout << "Elle est VIDE!\n"; else for (int i = 0; i < indiceSommet ; i++) cout << i << ")\t" << sommet[i] << endl; cout <> lettre ; cout << endl << endl; } bool estPalin(PileCar pile) { for(int i = 0, j = pile.getNbElem()-1; i < j ; i++, j--) if (pile.get(i) != pile.get(j)) return false; return true; } void verifier(string chaine) { PileCar pile; for (int i = 0 ; i < chaine.length() ; i++) { char unCar = chaine.at(i); if (unCar >= 'a' && unCar <= 'z') unCar += 'A' - 'a'; if (unCar >= 'A' && unCar <= 'Z') pile.empiler(unCar); } cout << "La pile representant la chaine transformee : \n" << pile << endl; cout << "La chaine " << chaine << " est-elle palindrome?: " << (estPalin(pile) ? "OUI!":"NON!") << endl << endl; } int main() { string chaine1 = "Laval", chaine2 = "Montreal", chaine3 = "Tu l'as trop ecrase, Cesar, ce port Salut!", chaine4 = "Et la marine va, papa, venir a Malte"; verifier(chaine1); verifier(chaine2); verifier(chaine3); verifier(chaine4); continuer(); return 0; } /* Exécution : La pile representant la chaine transformee : [L, A, V, A, L] La chaine Laval est-elle palindrome?: OUI! La pile representant la chaine transformee : [M, O, N, T, R, E, A, L] La chaine Montreal est-elle palindrome?: NON! La pile representant la chaine transformee : [T, U, L, A, S, T, R, O, P, E, C, R, A, S, E, C, E, S, A, R, C, E, P, O, R, T, S , A, L, U, T] La chaine Tu l'as trop ecrase, Cesar, ce port Salut! est-elle palindrome?: OUI! La pile representant la chaine transformee : [E, T, L, A, M, A, R, I, N, E, V, A, P, A, P, A, V, E, N, I, R, A, M, A, L, T, E ] La chaine Et la marine va, papa, venir a Malte est-elle palindrome?: OUI! Appuyez sur une lettre suivie de Entree */