2009-04-07 9 views
0

J'ai un problème avec mon programme. Ce devrait être un programme qui reconnaît palindome à travers la pile. Tout fonctionne bien, seule la chose qui ne fonctionne pas est l'impression des piles (originales et inversées) une fois la fonction terminée. Voici mon code entier, et le problème est au cas d et e:Vérificateur de palindrome basé sur une pile

#include <iostream> 

using namespace std; 


const int MAXSTACK = 21; 
class stack { 
private: 
    int stop; 
    char stk[MAXSTACK]; 
public: 
    stack(); 
    ~stack(); 
    stack(const stack& s); 
    void push(const char c); 
    char pop(); 
    char top(void); 
    int emptystack(void); 
    int fullstack(void); 
    void stack_print(void); 
    int stack::create(void); 
}; 
stack::stack() 
{ 
    stop = 0; 
} 
stack::~stack() { } 
stack::stack(const stack& s) 
{ 
    stop = s.stop; 
    strcpy(stk,s.stk); 
} 
void stack::push(const char c) 
{ 
    stk[stop++] = c; 
} 
char stack::pop() 
{ 
    return stop--; 
} 
char stack::top(void) 
{ 
    return stk[stop - 1]; 
} 
int stack::emptystack(void) 
{ 
    return !stop; 
} 
int stack::fullstack(void) 
{ 
    return stop == MAXSTACK; 
} 
void stack::stack_print(void) 
{ 
    for (int i=0; i<stop; i++) 
     cout<<stk[i]; 
    cout<<endl; 
} 
int stack::create(void) 
{ 
    return !stop; 
} 
char menu() 
{ 

    char volba; 

    cout<<"\n"; 
    cout<<" **********.\n"; 
    cout<<"\n"; 
    cout<<" a ... make new containers\n"; 
    cout<<" b ... delete content\n"; 
    cout<<" c ... enter string\n"; 
    cout<<" d ... print on screen first stack\n"; 
    cout<<" e ... print on screen first stack\n"; 
    cout<<" f ... is it palindrom\n"; 
    cout<<" x ... exit\n"; 
    cout<<"\n your choice : "; 

    cin >> volba; 
    return volba; 
} 
int main() { 
    char palindrome[MAXSTACK]; 
    char volba; 
    stack original,reversed; 
    int stackitems = 0,i; 
    //cin.getline(palindrome,MAXSTACK); 
    do{ 
     volba = menu(); 
     switch (volba) 
     { 
     case'a': 
      { 
       original.create(); 
       reversed.create(); 
       cout<<"done'"; 
       break; 
      } 
     case'b': 
      { 
      original.emptystack(); 
      reversed.emptystack(); 
      cout<<"empty"; 
      break; 
      } 
     case'c': 
      { 
       cout<<"enter your string"<<endl; 
      cin.get(); 
      //cin.get(); 
      cin.getline(palindrome,MAXSTACK); 
    for(int o = 0; o < strlen(palindrome); o++) 

     if (isalpha(palindrome[o])) 
     { 
      original.push(tolower(palindrome[o])); 
      stackitems++;       
     } 
      original.stack_print(); 

     break; 
      } 
     case'd': 
      { 
       original.~stack(); 
       for(int g = 0; g < strlen(palindrome); g++) 
       original.push(tolower(palindrome[g])); 
       original.stack_print(); 
      } 
      /*//cin.getline(palindrome,MAXSTACK); 
    for(int g = 0; g < strlen(palindrome); g++) 

     if (isalpha(palindrome[g])) 
     { 
      original.push(tolower(palindrome[g])); 
      stackitems++;       
     } 

      } 
      original.stack_print();*/ 
      break; 


     /*{ 
       cout<<"original: "; 
     original.stack_print(); 
       break; 
      }*/ 
      break; 
     case'e': 
      { 
      cout<<"reversed:"<<endl; 
      for(i = 0; i < stackitems; i++) { 
      reversed.push(original.top()); 
      original.pop(); 
     } 
     reversed.stack_print(); 
      } 
      break; 

     case'f': 
      { 
      for(i = 0; i < stackitems/2; i++) { 
      reversed.push(original.top()); 
      original.pop(); 
     } 


     if (stackitems % 2) 
      original.pop(); 

     while (!original.emptystack()) { 
      if (original.top() != reversed.top()) break; 
      original.pop(); reversed.pop(); 
     } 
     if (original.emptystack()) 
      cout << "it is palindrom\n"; 
     else 
      cout << "not palindrom\n"; 

     break; 

      } 
     default:cout<<"!??!"; 


     } 
    } while(volba!='x'); 
} 

Répondre

1

Vous avez appelé explicitement le destructeur de votre pile. Il n'y a presque jamais de bonne raison de le faire. Si la pile est locale ("sur la pile", hee hee), la compilation le fera pour vous. S'il est sur le tas, créé avec new, appelez le delete dessus, ce qui provoquera l'appel du destructeur par le compilateur.

case'd': 
      { 
        original.~stack(); 
+0

c'était juste l'une des tentatives, mais merci pour la note –

0

Vous avez commenté palindrome lecture :)

//cin.getline(palindrome,MAXSTACK); 
+0

oui, il ne devrait pas être là –

+0

Utilisez-vous Visual Studio? Avez-vous un débogueur? Juste le déboguer. – Vinay

0

Il y a quelques choses que je voudrais répondre avec. Premièrement, je pense que GMan, tpdi et Vinay ont tous de bons points. Cette FAQ explique pourquoi appeler le destructeur sur une variable locale est une mauvaise idée.

Je réalise que c'est juste un simple problème de devoirs et que vous essayez probablement de garder votre classe de pile légère, mais vous pourriez considérer using a container class instead of an array of characters dans votre classe de pile. Ensuite, je ne suis pas sûr que vos fonctions emptystack et create font ce que vous pensez qu'elles font. Lorsque vous déclarez vos classes de pile originales et inversées dans le programme principal, la mémoire est allouée à votre tableau de caractères interne. Ce n'est pas vraiment nécessaire dans ce cas d'avoir une fonction de création. Peut-être que si vous alliez de la mémoire sur le tas pour votre tableau de caractères, vous mettriez ce code dans la fonction create (si vous avez choisi de le quitter pour une raison quelconque), mais ce n'est pas le cas ici.

De même, emptystack ne fait vraiment rien. Il serait préférable que la pile vide place la variable d'arrêt à 0. Au moins de cette façon, la pile semblera vide la prochaine fois que quelqu'un essaiera de l'utiliser.

On pourrait en dire beaucoup plus sur cette classe, mais il serait peut-être préférable d'essayer certaines des suggestions ici, comme l'utilisation de std :: stack et le débogage. C'est, après tout, votre devoir: il vous aidera beaucoup plus à l'avenir si vous trouvez la solution vous-même!