I’m trying to make a stack implementation in C++ but when I try to print the stack,
it just prints the first element instead of the whole stack.
I’ve tested it and I’m pretty sure that my Push function is right, but I’m not sure.
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
int main(){
StackElement *stack = new StackElement();
stack->data = 20;
stack->Push(30,stack);
stack->Push(40,stack);
stack->Print(stack);
}
#include <stdio.h>
#include <stdlib.h>
class StackElement{
public:
int data;
StackElement* next;
StackElement();
void StackElement::Push(int value, StackElement *oldElement);
void StackElement::Print(StackElement *element);
};
StackElement::StackElement(){
next = NULL;
}
void StackElement::Push(int value, StackElement *oldElement){
StackElement *newElement = new StackElement();
newElement->data = value;
printf("Element added to stack: %d\n", newElement->data);
oldElement->next = newElement;
}
void StackElement::Print(StackElement *element){
while(element->next != NULL){
printf("%d\n",element->data);
element = element->next;
}
}
Your code kept loosing the previous pushed element, leaking memory, as @Beta described.
I suggest comparing my code below to your code. You’ll see, I’ve moved the handling of the stack elements outside, just to be able to keep track of the first element. Also, notice that there is no pointer in the main function. That is what we expect from a class.
Stack_element is a struct really as there’s not much point in making the Stack_element itself encapsulated, it is just an implementation detail of Stack.
So here’s my code derived from yours
and in the main function just call
REMARK: For a C++ish print you might want to do an
ostream& print(ostream& os)instead, wherejust to be able to write
std::cout << stack.print() << std::endl;. The benefit of this is that you can easily redirect to a file.