UNPKG

@figliolia/data-structures

Version:

Efficient data structures for every day programming

70 lines (69 loc) 1.86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MinStack = void 0; const MinMaxStack_1 = require("./MinMaxStack"); /** * Min Stack * * A stack maintaining a reference to it's lowest weighted item * * ```typescript * import { MinStack } from "@figliolia/data-structures"; * * const stack = new MinStack<number>(value => value); * stack.push(3); // min = 3 * stack.push(2); // min = 2 * stack.push(1); // min = 1 * stack.min // 1 * stack.pop() // min = 2 * ``` */ class MinStack extends MinMaxStack_1.MinMaxStack { constructor() { super(...arguments); this.min = null; } get minimum() { return this.min === null ? null : this.extract(this.min); } setMinMax(val) { const value = this.extract(val); const min = this.minimum; if (min === value) { this.occurances++; return; } if (min === null || value < min) { this.min = val; this.occurances = 1; } } findMinMax(val) { const value = this.extract(val); if (value === this.minimum) { this.occurances--; if (this.occurances === 0) { this.findMin(); } } } findMin() { let occurances = 0; let minValue = null; let min = null; for (const value of this.storage) { const currentValue = this.extract(value); if (minValue === null || currentValue < minValue) { min = value; occurances = 1; minValue = currentValue; } else if (minValue === currentValue) { occurances++; } } this.min = min; this.occurances = occurances; } } exports.MinStack = MinStack;