Skip to content

Instantly share code, notes, and snippets.

@hk-skit
Last active December 7, 2020 21:23
Show Gist options
  • Save hk-skit/99be2afd1b732c834f79eba60bb2f70e to your computer and use it in GitHub Desktop.
Save hk-skit/99be2afd1b732c834f79eba60bb2f70e to your computer and use it in GitHub Desktop.
Generic Stack in TypeScript
interface StackConstructor<T> {
new <T>(n: number): Stack<T>
}
export class Stack<T>{
private data: T[] = [];
static readonly OVERFLOW = 'OVERFLOW';
static readonly UNDERFLOW = 'UNDERFLOW';
constructor(private size: number) {
}
push(item: T): number | string {
return this.size > this.data.length ? this.data.push(item) : Stack.OVERFLOW;
}
pop(): T | string {
return this.data.pop() || Stack.UNDERFLOW;
}
display(): void {
this.data.forEach(item => console.log(item.toString()));
}
}
function initialise<T>(c: StackConstructor<T>, ...args: T[]): Stack<T> {
return args.reduce((stack, item) => {
stack.push(item);
return stack;
}, new c<T>(args.length));
}
var numberStack: Stack<number> = initialise<number>(Stack, 1, 2, 3, 4, 5, 6, 7, 8);
var stringStack: Stack<string> = initialise<string>(Stack, 'Yoda', 'Skywalker', 'Han Solo', 'R2', 'Wan');
numberStack.display();
stringStack.display();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment