/**栈接口 */
interface Stack<T>{
/**入栈 */
push(item:T):void;
/**出栈 */
pop():T|undefined;
/**取出栈顶元素 */
peek():T|undefined;
/**非空判断 */
isEmpty():boolean;
/**栈长 */
size():number;
}
/**泛型栈结构 */
class StackImpl<T> implements Stack<T>{
private items:Array<T>=[];
push(item: T): void {
this.items.push(item);
}
pop(): T|undefined {
return this.items.pop();
}
peek(): T|undefined {
return this.items[this.items.length-1];
}
isEmpty(): boolean {
return this.items.length===0;
}
size(): number {
return this.items.length;
}
}
/**
* 在TS中,数组、字符串、数组、接口非常常见
* 如果要定义一个对象的key和value类型,可以用到TS的Record:Record后面的泛型就是对象键和值的类型
* Record<K, T>构造具有给定类型T的一组属性K的类型
*
* 此处通过工厂方法,产出一个泛型栈
* 通过Record 类型,存储泛型栈的,K(string 类型)--V(栈结构类型)
*/
class StackFactory{
private static ins:Record<string,Stack<any>>={};
public static getInstance<T>(key:string):Stack<T>{
if(!(key in StackFactory.ins)){
StackFactory.ins[key]=new StackImpl<T>();
}
return StackFactory.ins[key] as Stack<T>;
}
public static clearIns():void{
StackFactory.ins={};
}
}
/**---------------------使用方法----------------------------- */
/*
const numberStack =StackFactory.getInstance<number>('numberStack');
numberStack.push(1);
numberStack.push(2);
console.log(numberStack.pop());//输出: 2
*/