export interface Queue { _data: T[] push: (ele: T) => void pushArray: (ele: T[]) => void pop: () => T | undefined isEmpty: () => boolean peek: () => T | undefined } export function baseQueue(): Queue { return { _data: [], push: function (element: T): void { this._data.push(element); }, pushArray: function (arr: T[]) { for (let ele of arr) { this._data.push(ele); } }, pop: function (): T | undefined { return this._data.shift(); }, peek: function (): T | undefined { return this._data[0]; }, isEmpty: function (): boolean { return this._data.length == 0; }, } } export function queueFromArray(arr: T[]): Queue { let base: Queue = baseQueue(); base._data = arr; return base; } export interface Stack { _data: T[] pop: () => T | undefined peek: () => T | undefined push: (element: T) => void size: () => number isEmpty: () => boolean clear: () => void cloneData: () => T[] } export function baseStack(): Stack { return { _data: [], size: function (): number { return this._data.length; }, pop: function (): T | undefined { return this._data.pop(); }, peek: function (): T | undefined { return this._data[this.size() - 1]; }, push: function (ele: T): void { this._data.push(ele); }, isEmpty: function (): boolean { return this.size() == 0; }, clear: function (): void { this._data = []; }, cloneData: function (): T[] { return [... this._data]; } } }