认识栈结构
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为钱顶,相对地,把另一端称为栈底,向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
特点:后进先出即 Last in first out(LIFO)
函数调用栈
an函数执行完出栈...a2函数执行完出栈,a1函数执行完出栈 —— 函数任务执行完成。
封装栈结构
// push 进栈(添加一个元素到栈顶)
// pop 出栈
// peek 返回栈顶
// isEmpty() 判断是否是空栈
// clear() 清空栈结构
// size() 栈里有几个元素
// toString() 转为普通字符串(可有可无)
class Stack{
// constructor(){
// this.items = [];
// }
// items = []; // items 可以放在 constructor中,也可以直接提到外面来
// _items = []; // 给items加下划线_,表示是私有的。君子协定,大家公认的,但其实外部依旧可以访问修改的。
#items = []; // es13 出现 js 默认支持的私有属性,加井号 # 表示私有属性。
pop(){
this.#items.pop();
}
push(data){
this.#items.push(data);
}
peek(){
// return this.items[this.items.length - 1]
return this.#items.at(-1);
}
isEmpty(){
return this.#items.length === 0;
}
size(){
return this.#items.length;
}
clear(){
this.#items = []
}
toString(){
return this.#items.join(" ")
}
}
let stack = new Stack()
测试:
栈结构的应用
- 进制的转换
class Stack{
#items = [];
pop(){
return this.#items.pop();
}
push(data){
this.#items.push(data);
}
peek(){
// return this.items[this.items.length - 1]
return this.#items.at(-1);
}
isEmpty(){
return this.#items.length === 0;
}
size(){
return this.#items.length;
}
clear(){
this.#items = []
}
toString(){
return this.#items.join(" ")
}
}
function convert(decNumber, base){
let remStack = new Stack()
let number = decNumber
let string = ""
let baseString = "0123456789ABCDEF"
while(number > 0) {
remStack.push(number%base)
number = Math.floor(number/base)
}
while(!(remStack.isEmpty())){
string += baseString[remStack.pop()]
}
return string
}
convert(50, 2) // 110010
convert(50, 8) // 62
convert(500, 16) // 1F4