2009-09-10 11 views
2

Hey all! Avoir un peu de mal avec ma pile. Im essayant d'imprimer chaque élément que j'ai poussé sur la pile. A partir de la pile ctor, nous savons que nous avons une taille fixe pour le tableau. Donc, je les éléments struct allouer objet à tenir juste que beaucoup d'espace:Mise en œuvre de la pile C++

stack::stack(int capacity) 
{ 
    items = new item[capacity]; 

    if (items == NULL) { 
    throw "Cannot Allocoate Sufficient Memmory"; 
    exit(1); 
    } 
    maxSize = capacity; 
    top  = -1; 
} 

Oui, objets est un type struct de l'objet « item ». Jetez un coup d'oeil:

class stack 
{ 
    stack(int capacity); 
    ~stack(void); 
... 
    private: 
    int maxSize; // is for the item stack 
    int top;  // is the top of the stack 
    struct item { 
     int n; 
    }; 
    item  *items;     

    public: 
    friend ostream& operator<<(ostream& out, stack& q) 
    ... 

D'abord et formost nous voulons ajouter à la pile en appuyant sur chaque élément entrant dans le tableau FILO:

bool stack::pushFront(const int n) 
{ 
    if (top >= maxSize-1) 
{ 
    throw "Stack Full On Push"; 
    return false; 
} 
else 
{ 
    ++top; 
    items[top].n = n; 
} 
return true; 
} 

// just a textbook example here: 
stack::~stack(void) 
{ 
    delete [] items; 

    items = NULL; 
    maxSize = 0; 
    top  = -1; 
} 

Oui la vraie question pour moi est les articles [++ top] .n = n; déclaration. J'ai essayé de découvrir comment je peux glisser (+) le tableau d'éléments pour voir TOUS les éléments du tableau après que je pousse sur la pile. Je me demande pourquoi je ne peux pas faire glisser les éléments [++ top] .n = n instruction quand je suis en train de déboguer. Tout ce qui vient est la valeur qui est passée en tant que 'n' paramater. Dois-je utiliser un tableau de type d'objet stack pour stocker les valeurs?

Quand je surcharger l'opérateur < < et essayer d'imprimer les éléments que je reçois un nombre négatif incroyablement grand:

ostream& operator<<(ostream& out, stack& q) 
{ 
    if (q.top <= 0) // bad check for empty or full node 
    out << endl << "stack: empty" << endl << endl; 
    else 
     for (int x = 0; x < q.maxSize; x++) 
     { 
      out << q.items[x].n; // try to print elements 
     } 
    return out; 
} 

Je suis loin et je besoin de guidence si quelqu'un a le temps!

+0

Vous voulez voir les articles dans le débogueur? Quel éditeur utilisez-vous? – Naveen

+0

N'utilisez pas la balise pre sur SO, mais le bouton de retrait de code à la place; voir ma dernière édition. –

+0

Quel type d'opération Faire "sortir"? –

Répondre

3

Dans l'opérateur < < surchargé dans la boucle for, vous itérez des temps de taille maximale. Mais vous n'avez peut-être pas poussé les éléments maxsize dans la pile. Vous devriez répéter les meilleurs temps. Également, écrivez un constructeur par défaut pour la structure de l'article et initialisez toutes les variables afin que vous n'ayez pas de valeur de déchet lorsque vous essayez de les imprimer.

+0

Je ne comprends pas cela, b/c je sais que j'ai poussé plus de 4 .. – user40120

+0

Disons que vous avez déclaré la capacité de la pile de 10 et poussé 4 éléments. Dans votre boucle for, vous itérez 10 fois. De ce premier 4 va imprimer les valeurs correctes mais les 6 prochaines seront garbage car vous n'avez ni initialisé aucune valeur assignée à la variable n dans l'élément de structure. Donc, si vous écrivez un constructeur par défaut pour la structure de l'item, cela sera appelé quand vous aurez un nouvel item [capacité] dans le constructeur de la pile et que n sera initialisé correctement. – Naveen

2

Lors de l'impression de la pile, vous ne devez aller au-dessus, pas jusqu'à maxSize.