基础数据结构栈(Stack) 学习与应用
- 什么是栈?
- 基本特点
- 图解原理
- 代码实现
- 应用场景
什么是栈(Stack)?
栈是一种“后进先出”(LIFO)的数据结构 ,是一种特殊的线性表。
基本特点
遵循定义里的两个重要性质。 一、线性表。 所以元素的增删改查操作都只能在表的一端进行,即栈顶。 二、遵循“后进先出”(LIFO)的原则。最后添加的元素总是在最先出栈,栈对元素的访问加以限制,仅仅提供对栈顶元素的访问操作
图解原理


其中data1为栈底, data4处为栈顶
代码实现
export interface IStack<T>{
//判断栈空
empty(): boolean;
//判断栈满
full(): void;
//清除栈
clear(): void;
//入栈
push(elem T);
//出栈
pop(): T|undefined;
//查看栈顶
peek(): T|undefined;
}
export class Stack <T>{
protected _elems: T[] = [];
protected _maxLength: number = 0;
protected _length: number = 0;
constructor(maxLength: number = Infinity){
this.setMaxLength(maxLength);
}
get maxLength(): number{
return this._maxLength;
}
private setMaxLength(val: number){
this._maxLength = val;
}
clear(){
this._elems = [];
}
get length(): number{
return this._elems.length;
}
empty(): boolean{
return this._elems.length === 0;
}
full () {
return this._elems.length === this._maxLength;
}
push(elem: T){
if(this.full()){
return false;
}
this._elems.push(elem);
return true;
}
pop(): T | undefined{
if(this.empty()){
return undefined;
}
return this._elems.pop();
}
peek(): T| undefined{
if(this.empty()){
return undefined;
}
return this._elems[this._elems.length - 1];
}
}
应用场景
- 判断单个括号是否平衡,判断左右括号是否匹配
((((()
()))
((()))
- 将十进制转化为二进制数
将十进制数不断除以2,将余数入栈,最后再一次弹出
- 在游戏中应用, 管理UI显示。
UI 的显示正好符合“后进先出”的原则
export class Panel{
show (){
}
hide (){
}
}
export class UIManager{
_panelStack: Stack<Stack<Panel>> = new Stack();
}