Stack Mit verketteten Liste in C++
Ich versuche zu schaffen, einen stack mit verketteten Listen in c++. Aber das display-Funktion, die ich geschrieben habe gibt nur die Spitze des stack. Ich kann wirklich nicht verstehen, warum dies geschieht. Jede Hilfe oder Aufklärung sehr dankbar. Dank
#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();
}
Er druckt nur die folgenden:
3
die Länge der Stapel 6
--------xxxxxxx-------xxxxxxxx--------xxxxxxx-----------xxxxxxxxxxxxx--------------
Nach der Bearbeitung der code sieht so aus:
und funktioniert auch! (Dank an @Kaathe) 😛
#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;
};
- Ich sehe nicht, wie Sie Sie initialisieren top of stack. "n->next='\0'; top->next=n;" sollte "n->next= top>next; top->next=n;"
- Ich bin versucht zu kopieren der Daten von "oben" in n und machen Sie "top" auf "n" wie folgt : oben(Punkte, n)->n(Punkte auf null)
- Danke!!! JackyZhu Hab!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie
push
Sie möchten, erstellen Sie eine völlig neueNode
seine Daten auf den Wertd
, und zeigen Sie es an den alten top of stack. Sie können dann legen Sie die Spitze des Stapels zu diesem neuen Knoten. Braucht man eigentlich nicht zu ändern, die alten top-Knoten überhaupt.So schieben Sie Lesen konnte:
Mir ist gerade aufgefallen, dass
pop
auch nicht so Verhalten, als erwartet, als Sie wegzuwerfen, den obersten Knoten, und die Daten zurück, die in den Knoten darunter. Vielleicht könnten Sie schreiben:Es wäre wahrscheinlich auch eine gute Idee, um zu verhindern, dass die Menschen knallen die leeren stapeln (beispielsweise durch die überprüfung, dass
length >= 1
am Anfangpop()
.Schließlich
displaystack
werden Art zerstören dieStack
Objekt, wenn genannt, durch Verlust der Zeiger auf den obersten Knoten. Vielleicht wäre dies besser:Macht es mehr Sinn für mich zu Ende der verknüpften Liste mit einem
nullptr
zu.Auch der Stapel sollte einen Destruktor, die
delete
s alle seineNode
s - ich lasse Sie schreiben, dass man 😉~Stack() { while(top!=NULL) { Node* toDelete=top; top=top->next; delete toDelete; } }
Beim drucken (in
displaystack
) sollten Sie eine temporäre variable, anstatt destruktiv Aktualisierung der top-Variablen.Um Speicherlecks zu vermeiden in
pop()
sollten Sie auchdelete
den Knoten, die zuvor zugewiesen mitnew
.Ich würde überrascht sein, wenn Sie Ihr Programm funktioniert, wenn Sie immer noch diese in Ihrem code:
Lösung ist Links als übung für dem Leser 😉
top->next=NULL
UNDtop=NULL
. bitte hilf mir zu verstehen!Können Sie ersetzen
while(top->next!='\0')
zuwhile(top!='\0')
Es sollte dann funktionieren...