Stack
A LIFO (Last-In, First-Out) abstract data type supporting push and pop in O(1).
Syntax
class Stack {
#data = [];
push(val) { this.#data.push(val); }
pop() { return this.#data.pop(); }
peek() { return this.#data.at(-1); }
get size(){ return this.#data.length; }
}
Returns
Stack — A new Stack instance backed by a dynamic array.
Examples
class Stack {
#data = [];
push(val) { this.#data.push(val); }
pop() { return this.#data.pop(); }
peek() { return this.#data.at(-1); }
get size(){ return this.#data.length; }
isEmpty() { return this.#data.length === 0; }
}
// Balanced parentheses check
function isBalanced(s) {
const stack = new Stack();
const match = { ')': '(', ']': '[', '}': '{' };
for (const ch of s) {
if ('([{'.includes(ch)) stack.push(ch);
else if (')]}'.includes(ch)) {
if (stack.pop() !== match[ch]) return false;
}
}
return stack.isEmpty();
}
console.log(isBalanced('({[]})'));
console.log(isBalanced('([)]'));
Output
true
false
// Iterative DFS using a stack
function dfs(graph, start) {
const visited = new Set();
const stack = new Stack();
stack.push(start);
while (stack.size > 0) {
const node = stack.pop();
if (visited.has(node)) continue;
visited.add(node);
for (const neighbor of graph[node] ?? []) stack.push(neighbor);
}
return [...visited];
}
const g = { A: ['B', 'C'], B: ['D'], C: [], D: [] };
console.log(dfs(g, 'A'));
Output
[ 'A', 'C', 'D', 'B' ]
Notes
| Operation | Best | Avg | Worst | Space |
|----------|------|------|-------|-------|
| Push | O(1) | O(1) | O(1)* | O(n) |
| Pop | O(1) | O(1) | O(1) | O(1) |
| Peek | O(1) | O(1) | O(1) | O(1) |
*Amortized O(1) — occasional array resize is O(n).
JavaScript's built-in `Array` already acts as a stack via
`push`/`pop`. Wrapping it in a class adds private state and
a clean API. Use a linked-list-backed stack to guarantee strict
O(1) push without amortisation.