I am trying to implement a stack with Java:
public class Stack<E> {
Node top = null;
public void push(E data) {
Node node = new Node(data);
if (null != top) {
node.next = top;
}
top = node;
}
public E pop() {
if (null == top) {
throw new IllegalStateException("Stack is empty");
} else {
E data = top.data;
top = top.next;
return data;
}
}
public E peek() {
if (null == top) {
throw new IllegalStateException("Stack is empty");
} else {
E data = top.data;
return data;
}
}
public void print() {
if (null == top) {
throw new IllegalStateException("Stack is empty");
} else {
Node node = top;
while(null != node) {
System.out.println(node.data);
node = node.next;
}
}
}
private class Node {
Node next;
E data;
Node(E data) {
this.data = data;
}
}
}
I am looking for feedback for the implementation. Also, I wanted to know if the pop()
implementation can cause a memory leak?
2 Answers 2
I wanted to know if the pop() implementation can cause a memory leak?
It will not cause a memory leak, because java is a garbage collected language. When top is no longer accessible the garbale collecter will free top if it sees fit.
feedback:
In
push()
the null check is unnessecary, becausenode.next
is already null by default.public void push(E data) { Node node = new Node(data); node.next = top; top = node; }
Rather then have a
print()
method, create atoString()
method.toString()
is a method ofObject
that is used across java to get a string representation of an object. This will make it easier to print your object to different streams.In
Node
, create agetData()
(and optionallysetData()
) method to control access to the data class, or make data final.make
top
private to control use of your class to the supported methods.
Printing an empty stack should not cause an exception. It should print nothing (or possibly print something that represents an empty stack).
There is no way to tell if the stack contains anything, other than peeking and catching an exception. Add a size()
method, or at the very least isEmpty()
.