2009-04-07 11 views
0

Ich habe ein Problem mit meinem Programm. Es sollte Programm sein, das Palindom durch den Stapel erkennt. Alles funktioniert gut, nur was nicht funktioniert, druckt Stapel (Original und umgekehrt) nachdem die Funktion fertig ist. Hier ist meine gesamte Code, und das Problem ist in Fall d und e:Stack-basierte Palindrome-Checker

#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'); 
} 

Antwort

1

Sie ausdrücklich Ihr Stack des Destruktor aufgerufen haben. Es gibt fast nie einen guten Grund, dies zu tun. Wenn der Stapel ein lokaler ("auf dem Stapel", hee hee) ist, wird die Kompilierung es für Sie tun. Wenn es sich um den Heap handelt, der mit new erstellt wurde, rufen Sie delete darauf auf, wodurch der Compiler den Destruktor aufrufen wird.

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

es war nur einer der Versuche, aber ich danke Ihnen für den Hinweis –

0

Sie haben Palindrom Lesen kommentiert :)

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

ja, es sollte nicht dort sein –

+0

Verwenden Sie Visual Studio? Hast du einen Debugger? Debugge es einfach. – Vinay

0

Es gibt ein paar Dinge, die ich mit reagieren möchten. Erstens denke ich, GMAN, TPDI und Vinay haben alle gute Punkte. Dieses FAQ erklärt, warum das Aufrufen des Destruktors auf einer lokalen Variablen eine schlechte Idee ist.

Ich weiß, dies ist nur ein einfaches Hausaufgaben-Problem und Sie versuchen wahrscheinlich nur, Ihre Stack-Klasse leicht zu halten, aber Sie könnten using a container class instead of an array of characters in Ihrer Stack-Klasse betrachten.

Als nächstes bin ich nicht sicher, ob Ihre leeren Stacks und Create-Funktionen tun, was Sie denken, dass sie tun. Wenn Sie Ihre ursprünglichen und umgekehrten Stapelklassen im Hauptprogramm deklarieren, wird der Speicher für Ihr internes Zeichen-Array zugewiesen. Es ist in diesem Fall nicht wirklich notwendig, eine Erstellungsfunktion zu haben. Vielleicht würden Sie diesen Code in die create-Funktion einfügen, wenn Sie Speicher auf dem Heap für Ihr Zeichen-Array zuweisen würden (wenn Sie ihn aus irgendeinem Grund aus dem Konstruktor herauslassen), aber das ist hier nicht der Fall.

Ähnlich macht leererstack nichts wirklich. Es wäre besser, wenn der leere Stapel die Variable stop member auf 0 gesetzt hätte. Zumindest würde der Stapel so leer erscheinen, wenn jemand das nächste Mal versucht, ihn zu benutzen.

Es gibt viel mehr, was man über diese Klasse sagen könnte, aber es könnte besser sein, wenn Sie einige der Vorschläge hier ausprobiert haben wie std :: stack und debugging. Dies ist schließlich Ihre Hausaufgabe: Sie wird Ihnen in Zukunft viel mehr helfen, wenn Sie selbst die Lösung finden!