Hello, eager learners! In today's lesson, we're exploring Stacks, a crucial data structure in programming. We aim to understand Stacks, implement and manipulate Stacks in JavaScript, and analyze their complexities. Let's dive right in!
First and foremost, let's understand what a Stack is. Imagine a stack of plates that you can only remove from the top. This concept exemplifies Stacks, which follow a Last-In, First-Out (LIFO) structure. Let's see an implementation in JavaScript, where we'll Push
(add), Pop
(remove), and Peek
(view the top) elements.
JavaScript1class Stack { 2 constructor() {this.items = [];} // Empty Stack 3 isEmpty() {return this.items.length == 0;} // Check if Stack is empty 4}
We start with introducing the stack class that stores an array of items.
In JavaScript, arrays can work as Stacks. They have the necessary built-in methods. However, let's implement each operation ourselves to understand this data structure better.
The Push
operation adds a new element to the top of the Stack. It is simply written as:
JavaScript1push(element) { 2 this.items.push(element); 3}
The Pop
operation removes the topmost element from the Stack. It first checks if the Stack is empty, then returns "Underflow". Otherwise, it removes and returns the top element of the Stack.
JavaScript1pop() { 2 return this.items.length == 0 ? "Underflow" : this.items.pop(); 3}
The Peek
operation lets us view the topmost element without removing it.
JavaScript1peek() { 2 return this.items[this.items.length - 1]; 3}
The Push
, Pop
, and Peek
operations take constant time — O(1). This is because these operations are performed at the end of the array. The space complexity is proportional to the number of elements — O(n), where n
is the quantity of Stack elements.
Here is a complete stack implementation with usage example:
JavaScript1class Stack { 2 constructor() {this.items = [];} // Empty Stack 3 4 push(element) { 5 this.items.push(element); 6 } // Add element 7 8 pop() { 9 return this.items.length == 0 ? "Underflow" : this.items.pop(); 10 } // Remove element 11 12 peek() { 13 return this.items[this.items.length - 1]; 14 } // Check top element 15 16 isEmpty() { 17 return this.items.length == 0; 18 } // Check if Stack is empty 19} 20 21let stack = new Stack(); 22stack.push(1); 23stack.push(2); 24stack.push(3); 25console.log(stack.pop()); // 3 26console.log(stack.peek()); // 2
However, in JavaScript we usually don't implement stacks ourselves or use any special object for it. Instead, we simply use arrays as stacks:
1let stack = []; 2stack.push(1); 3stack.push(2); 4stack.push(3); 5console.log(stack.pop()); // 3 6console.log(stack[stack.length - 1]); // 2
Well done! You've completed your journey through Stacks in JavaScript, mastering their concept, implementation, operations, and complexity analysis. Exercise sessions await you to strengthen your skills further. So, let's set sail for some exciting hands-on practice!