我对JS栈的简单学习

我对栈的学习

由于是个新手,因此都是最简单的知识学习梳理。git

什么是栈

数组是计算机科学中最经常使用的数据结构,是数据元素的集合。有时候咱们须要一种添加或者删除元素时更可控的数据结构,他们就是队列和栈。数组

  • 队列是听从先进先出(FIFO)原则的一组有序的项,队列在尾部添加新元素,并从顶部移除元素。这里不先详细说明。数据结构

  • 栈是一种听从后进先出(LIFO)原则的有序集合,新添加的或者待删除的元素都保留在栈的末尾,称做栈顶,另外一端叫作栈底。新元素都在栈顶。学习

栈的示意图

栈也被用在编译语言的编译器和内存中保存变量、方法调用等。this

栈的学习

  • 栈的建立spa

建立一个类来表示栈。code

function Stack() {
    //各类属性和方法的声明
}

须要一种数据结构来保存栈里的元素,这里选择数组。队列

var items = [];
  • 栈的基本操做内存

入栈方法:添加元素到栈,这里要注意添加到栈的元素只能到栈顶,也就是栈的末尾。element

this.push = function (element) {
    items.push(element);
}

出栈方法:移除栈里的元素,注意移除的是最后添加进去的元素。

this.pop = function () {
    return items.pop();
}

对于栈来讲只能用push和pop方法来进行添加和删除元素。

获取栈顶元素:咱们想知道最后添加的元素是什么

this.peek = function () {
    return items[items.length - 1];
}

别忘了这里咱们使用数组来存储栈内的元素

判断栈空:栈为空返回true。

this.isEmpty = function () {
    return items.length == 0;
}

对于集合,最好是使用size来代替length,这里咱们简单了。

清空栈:移除栈内的全部元素,把栈清空

this.clear = function () {
    items = []; //最简单的方式
}

栈的使用

首先须要初始化Stack类,而后验证一下栈是否为空

var stack = new Stack();
console.log(stack.isEmpty()); //true,此时尚未添加元素

而后添加元素入栈

stack.push(8);
stack.push(4);

得到最后添加的元素

console.log(stack.peek()); //4,由于4是最后被添加的元素

再添加一个元素

stack.push(11);
console.log(stack.size()); //输出3,此时栈里有3个元素
console.log(stack.isEmpty()); //false,此时栈里已经有元素了

移除两个元素

stack.pop();
stack.pop();
console.log(stack.size()); //1,此时只剩下一个元素

进制的转换

10进制转换为其余进制一般都是整除法。(能够自行搜索进制转换时的方法以及形式)

/**
 * [数字,转换成相应进制的进制数]
 * @param  {[Number]} decNumber [想转的数]
 * @param  {[Number]} base      [想转的进制]
 * @return {[Number]}           [转换进制后的数]
 */
function baseConverter (decNumber, 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()) {
        //这里经过digits的下标来得到相应字符。好比pop出7,这里digits[7]就是7,pop出16,这里digits[16]就是F
        baseString += digits[remStack.pop()];
    }

    return baseString;
}

baseConverter(100345, 2); //11000011111111001
baseConverter(100345, 8); //303771
baseConverter(100345, 16); //187F9

下一篇简单的学习队列。。。。

相关文章
相关标签/搜索