栈
栈结构
是一个受限的线性表,后进先出
其显示是仅仅允许在表的一段进行插入和删除,可操作的一端叫栈顶,另一端称为栈底。
栈的应用
比如函数调用栈
当a调用了b,b调用了c
在这个执行过程中,先将a压入栈底,a没有执行完不会弹出,a执行中,调用了b,再将b压入栈底,
执行b时,有调用了c,就将c压入栈底,
c执行完之后,出栈,再执行b,执行完之后,b再出栈,再执行a,a执行完之后,出栈
面试题目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Zv0WQ5s-1646307629120)(C:\Users\Wlijun\AppData\Roaming\Typora\typora-user-images\image-20220225233246505.png)]
c
栈的操作
push(element) 添加一个新元素到栈顶位置
pops() 移除栈顶元素,同时返回被移除的元素
peek() 返回栈顶元素,不对栈做任何的修改(该方法不会移除栈顶的元素)
isEmpty() 如果栈里没有任何元素就返回true,否则返回false
size() 返回栈里的元素个数,这个方法和数组的length属性很类似
toString():将栈结构的内容以字符串的形式返回
栈结构的实现
基于数组实现
// 封装栈类
function Stack(){
//栈的属性
this.items=[]
// 栈的操作
//1,将元素压入栈底
Stack.prototype.push = function(elelment){
return this.items.push(element)
}
//2,从栈中取出元素
Stack.prototype.pop = function(){
return this.items.pop()
}
//3,查看栈顶元素
Stack.prototype.peek = function(){
return this.items[this.item.length - 1]
}
//4,判断栈是否为空
Stack.prototype.isEmpty = function(){
return this.items.length === 0
}
// 5,获取栈中元素的个数
Stack.prototype.size = function(){
return this.items.length
}
//6, toString 方法
Stack.prototype.toString = () => {
//希望输出的形式:20 10 12 8 7
let resultString = ''
for (let i of this.items){
resultString += i + ' '
}
return resultString
}
}
//栈的使用
const s = new Stack()
例子
// 十进制转成二进制
function fn(num) {
// 定义栈对象
let stack = new Stack()
console.log(typeof num)
// if (typeof num !== 'number') return null
while (num > 0) {
stack.push(num % 2)
num = Math.floor(num / 2)
}
// 从栈中取出数据
var numStr = ''
while (!stack.isEmpty()) {
numStr += stack.pop()
}
return numStr
}
// 测试
console.log(fn(100))