0

C++ でリンク リストを使用してスタックを作成しようとしています。しかし、私が書いた表示機能は、スタックの一番上だけを出力します。なぜこれが起こっているのか本当に理解できません。どんな助けや説明も大歓迎です。ありがとう

#include<iostream.h>
#include<conio.h>

class Node
{
protected:

    Node* next;
    int data;

public:

    Node(int d){data=d;}
    friend class Stack;
};

class Stack
{
public:
    Stack(){top->next='\0';length=0;}

void push(int d)
{
    Node *n=new Node(top->data);
    n->next='\0';
    top->next=n;
    top->data=d;
    length++;
}

int pop()
{
    top=top->next;
    length--;
    return top->data;
}

void displaystack()
{
    while(top->next!='\0')
    {
        cout<<top->data<<endl;
    top=top->next;
    }
}

int getlength()
{
    return length;
}

private:
    Node *top;
    int length;

};

void main()
{
    clrscr();
    Stack s;
    s.push(9);
    s.push(8);
    s.push(7);
    s.push(6);
    s.push(5);
    s.push(3);
    s.displaystack();
    int len=s.getlength();
    cout<<"length of stack is "<<len<<endl;
    getch();
}

次のように表示されるだけです: 3 スタックの長さは 6 です

--------xxxxxxx-------xxxxxxxx--------xxxxxxx-----------xxxxxxxxxxxxxxx------------ --

コードを編集すると、次のようになります。(@Kaathe に感謝) :P

#include<iostream.h>
#include<conio.h>

class Node
{
protected:
Node* next;
int data;

public:

Node(int d){data=d;}
friend class Stack;
};

class Stack
{
public:
Stack(){top->next=NULL;length=0;}
~Stack()
{
     while(top!=NULL)
 {
   Node* toDelete=top;
   top=top->next;
   delete toDelete;
 }

}

void push(int d)
{
Node *n=new Node(d);
n->next=top;
top=n;
length++;
}

int pop()
{
 Node* oldtop=top;
 top=top->next;
 int oldtopdata=oldtop->data;
 delete(oldtop);
 --length;
 return oldtopdata;
}

void displaystack()
{
Node* current=top;
while(current->next!=NULL)
    {
    cout<<current->data<<endl;
    current=current->next;
    }
}

int getlength()
{
return length;
}

private:
Node *top;
int length;

};
4

4 に答える 4

0

( で)印刷するときはdisplaystack、トップ変数を破壊的に更新するのではなく、一時変数を使用する必要があります。

でのメモリ リークを回避するには、を使用して以前に割り当てたノードpop()も使用する必要があります。deletenew

于 2013-08-25T14:53:18.797 に答える
0

あなたはに置き換えることができます それは動作するはずですwhile(top->next!='\0')...while(top!='\0')

于 2016-01-28T14:44:10.510 に答える
0

コードにこれがまだ含まれている場合、プログラムが機能する場合は驚くでしょう。

Stack(){top->next=NULL;length=0;}

解決策は読者の演習として残します;-)

于 2013-08-25T16:46:42.737 に答える