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.

See also