diff --git a/DataStructures/Stacks/StackOfLinkedList.java b/DataStructures/Stacks/StackOfLinkedList.java
index 09344211..5a2b8fa0 100644
--- a/DataStructures/Stacks/StackOfLinkedList.java
+++ b/DataStructures/Stacks/StackOfLinkedList.java
@@ -17,12 +17,12 @@ class StackOfLinkedList {
stack.push(4);
stack.push(5);
- stack.printStack();
+ System.out.println(stack);
System.out.println("Size of stack currently is: " + stack.getSize());
- stack.pop();
- stack.pop();
+ assert stack.pop() == 5;
+ assert stack.pop() == 4;
System.out.println("Top element of stack currently is: " + stack.peek());
}
@@ -48,65 +48,95 @@ class Node {
class LinkedListStack {
- Node head = null;
+ /**
+ * Top of stack
+ */
+ Node head;
- public void push(int x) {
- Node n = new Node(x);
- if (head == null) {
- head = n;
- } else {
- Node temp = head;
- n.next = temp;
- head = n;
- }
+ /**
+ * Size of stack
+ */
+ private int size;
+
+ /**
+ * Init properties
+ */
+ public LinkedListStack() {
+ head = null;
+ size = 0;
}
- public void pop() {
- if (head == null) {
- System.out.println("Empty stack. Nothing to pop");
- }
+ /**
+ * Add element at top
+ *
+ * @param x to be added
+ * @return true if add successfully
+ */
+ public boolean push(int x) {
+ Node newNode = new Node(x);
+ newNode.next = head;
+ head = newNode;
+ size++;
+ return true;
+ }
- Node temp = head;
+ /**
+ * Pop element at top of stack
+ *
+ * @return element at top of stack
+ * @throws NoSuchElementException if stack is empty
+ */
+ public int pop() {
+ if (size == 0) {
+ throw new NoSuchElementException("Empty stack. Nothing to pop");
+ }
+ Node destroy = head;
head = head.next;
- System.out.println("Popped element is: " + temp.data);
+ int retValue = destroy.data;
+ destroy = null; // clear to let GC do it's work
+ size--;
+ return retValue;
}
+ /**
+ * Peek element at top of stack
+ *
+ * @return element at top of stack
+ * @throws NoSuchElementException if stack is empty
+ */
public int peek() {
- if (head == null) {
- return -1;
+ if (size == 0) {
+ throw new NoSuchElementException("Empty stack. Nothing to pop");
}
return head.data;
}
- public void printStack() {
- Node temp = head;
- System.out.println("Stack is printed as below: ");
- while (temp != null) {
- if (temp.next == null) {
- System.out.print(temp.data);
- } else {
- System.out.print(temp.data + " -> ");
- }
- temp = temp.next;
+ @Override
+ public String toString() {
+ Node cur = head;
+ StringBuilder builder = new StringBuilder();
+ while (cur != null) {
+ builder.append(cur.data).append("->");
+ cur = cur.next;
}
- System.out.println();
+ return builder.replace(builder.length() - 2, builder.length(), "").toString();
}
+ /**
+ * Check if stack is empty
+ *
+ * @return true if stack is empty, otherwise false
+ */
public boolean isEmpty() {
- return head == null;
+ return size == 0;
}
+ /**
+ * Return size of stack
+ *
+ * @return size of stack
+ */
public int getSize() {
- if (head == null)
- return 0;
- else {
- int size = 1;
- Node temp = head;
- while (temp.next != null) {
- temp = temp.next;
- size++;
- }
- return size;
- }
+ return size;
}
}