1

我对栈的学习

因为是个新手,所以都是最简单的知识学习梳理。

什么是栈

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

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

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

栈的示意图

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

栈的学习

  • 栈的创建

创建一个类来表示栈。

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

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

var items = [];
  • 栈的基本操作

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

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

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


luckyziv
1.2k 声望52 粉丝

摸索中前进!!