栈的介绍
栈是一种遵从后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底。在栈里,新元素都是靠近栈顶,旧元素都接近栈底。
其实就想书堆一样,新的书就放在上面。如果要拿下面的书,必须先把上面的书拿走才能,才能拿到想要的书。准照后进先出原则。
再讲解一下:
如图。有三个元素的栈,栈顶是100[2],栈底是81[0]。整个栈长度为3。
如图,删除栈的第一个元素把栈顶15给删除,栈的长度4也变成3个。再删除第一个元素,栈顶11给删除,剩下栈就是8,5。
栈的代码实现
ES6代码
class Stack {
constructor () {
this.items = [];
}
push(...element){//添加一个(或几个)新元素到栈顶。
this.items.push(...element);
}
pop(){//移除栈顶的元素,同时返回呗移除的元素。
return this.items.pop();
}
peek(){//返回栈顶的元素(不对栈做任何修改)。
return this.items[this.items.length-1];
}
isEmpty(){//如果栈里没有任何元素就返回true,否则返回false。
return this.items.length == 0;
}
size(){//返回栈里的元素个数。
return this.items.length;
}
clear(){//移除栈里的所有元素。
this.items = [];
}
print(){//打印栈里的元素。
console.log(this.toString());
}
toString(){//把栈里的数据转成String返回。
return this.items.toString();
}
}
let stack = new Stack()//实例化
栈的使用案例
用一个10进制转2进栈的举例子。进制转发也是先除判断是否有余,保存一个是否有余的标示,再往下再次除,重复这个过程,直到数除完为0,依次排列起来(0101)。栈输出为(1010)如下图。
进制转换方法
function baseConverter(decNumber, base){//修改base可以输出为其他进制。
var remStack = new Stack(),
rem,
baseString = '',
digits = '0123456789ABCDEF';
while (decNumber > 0){
rem = Math.floor(decNumber % base);
remStack.push(rem);
decNumber = Math.floor(decNumber / base);
}
while (!remStack.isEmpty()){
baseString += digits[remStack.pop()];
}
return baseString;
}
console.log(baseConverter(10, 2));//1010
console.log(baseConverter(100345, 8));//303771
console.log(baseConverter(100345, 16));//187F9