栈的介绍
栈是一种遵从后进先出(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