一、认识栈
1、栈是一种受限的线性表,不同于数组可以在任意位置添加或删除元素,栈限制仅允许在它的其中一端进行元素的添加(称为进栈、入栈或者压栈)和删除(出栈或退栈),而这一端称为栈顶,另一端则叫栈底。
2、栈遵循LIFO(last in first out)原则,即后进先出。
二、函数调用栈
假如A函数中调用B,B调用C,C调用D;那么在A执行的过程中会将A压入栈,B执行时B也被压入栈,函数C和D执行时也会被压入栈。所以当前栈的顺序为:(栈底)A->B->C->D(栈顶);函数D执行完之后,会弹出栈被释放,弹出栈的顺序为D->C->B->A;
另外,为什么没有停止条件的递归会造成栈溢出?因为函数不断调用自身,不停地把相同的函数压入到栈里面,而函数本身又没有执行完,不会出栈,所以栈里面会有越来越多的函数,导致栈溢出。
三、栈的操作
function Stack() {
this.items = []
//栈的基本操作
//1、入栈
Stack.prototype.push = function (element) {
this.items.push(element)
}
//2、出栈
Stack.prototype.pop = function () {
return this.items.pop()
}
//3、查看栈顶元素
Stack.prototype.peek = function () {
return this.items[this.items.length - 1]
}
//4、判断栈是否为空
Stack.prototype.isEmpty = function () {
return this.item.length === 0;
}
//5、返回栈里面的元素个数
Stack.prototype.size = function () {
return this.items.length
}
//6、移除栈的所有元素
Stack.prototype.clear = function () {
this.items = []
}
//7、以字符串形式输出栈内数据
Stack.prototype.toString = function () {
let resultString = ''
for (let i of this.items){
resultString += i + ' '
}
return resultString
}
}
let a = new Stack();