@figliolia/data-structures
Version:
Efficient data structures for every day programming
63 lines (62 loc) • 1.65 kB
JavaScript
import { MinMaxStack } from "./MinMaxStack.js";
/**
* 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
* ```
*/
export class MinStack extends MinMaxStack {
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;
}
}