学习JavaScript数据结构与算法

栈(Stack)

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

创建一个类来表示栈,首先先声明这个类:

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

为栈声明如下的方法:

push(element(s)):添加一个(或几个)新元素到栈顶。

pop():移除栈顶的元素,同时返回被移除的元素。

peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它)。

isEmpty():如果栈里没有任何元素就返回true,否则返回false。

clear():移除栈里的所有元素。

size():返回栈里的元素个数。这个方法和数组的length属性很类似。

print():输出栈里的元素。

function Stack() {
    var items = [];
    this.push = function(element) {
        items.push(element);
    };
    this.pop = function() {
        items.pop();
    };
    this.peek = function() {
        return items[items.length - 1];
    };
    this.isEmpty = function() {
        return items.length === 0;
    };
    this.clear = function() {
        items = [];
    };
    this.size = function() {
        return items.length;
    };
    this.print = function() {
        console.log(items.toString());
    };
}

使用栈

var stack = new Stack();  // 初始化栈
console.log(stack.isEmpty());  // true
// 往栈里添加元素
stack.push(1);
stack.push(2);
// 获取栈顶的元素
console.log(stack.peek());  // 2
stack.push(9);
console.log(stack.size());  // 3
console.log(stack.isEmpty());  // false
stack.push(20);
// 移除栈顶的元素
stack.pop();  // 20被移除
stack.pop();  // 9被移除
console.log(stack.size());  // 2
stack.print();  // 输出[1, 2]

栈在计算机科学中,可以解决十进制转化为其他进制的问题

function baseConverter(decNumber, base) {
    var stack = new Stack(),
        rem,
        baseString = '',
        digits = '0123456789ABCDEF';
    while(decNumber > 0) {
        rem = Math.floor(decNumber % base);
        stack.push(rem);
        decNumber = Math.floor(decNumber / base);
    }

    while(!stack.isEmpty()) {
        baseString += digits[stack.pop()];
    }

    return baseString;
}
console.log(baseConverter(100345, 2)); //输出11000011111111001
console.log(baseConverter(100345, 8)); //输出303771
console.log(baseConverter(100345, 16)); //输出187F9

队列(Queue)

队列是遵循先进先出(FIFO,First In First Out,也称为先来先服务)原则的一组有序的项,类似于日常生活中排队、打印文档。最新添加的元素排在队列的末尾,从队列的顶部移除元素。

为队列声明如下的方法:
enqueue(element(s)):向队列尾部添加一个(或多个)新的项。

dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。

front():返回队列中第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息——与Stack类的peek方法非常类似)。

isEmpty():如果队列中不包含任何元素,返回true,否则返回false。

size():返回队列包含的元素个数,与数组的length属性类似。

function Queue() {
    var items = [];
    this.enqueue = function(element) {
        items.push(element);
    };
    this.dequeue = function() {
        items.shift();
    };
    this.front = function() {
        return items[0];
    };
    this.isEmpty = function() {
        return items.length === 0;
    };
    this.size = function() {
        return items.length;
    };
    this.clear = function() {
        items = [];
    };
    this.print = function() {
        console.log(items.toString());
    };
}

使用队列

var queue = new Queue();  // 初始化队列
console.log(queue.isEmpty());  // true
// 向队列添加元素
queue.enqueue('hello');
queue.enqueue('world');
console.log(queue.size());  // 2
queue.enqueue('!');
// 出队,先进先出
queue.dequeue();  // hello出队
queue.dequeue();  // world出队
queue.print();  // ['!']

链表

链表是一种动态的数据结构,可以在任意处添加或删除元素,它会按需进行扩容。
链表存储有序的数据集合,但不同于数组,链表中的元素在内存中并不是有序放置的。每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成。

猜你喜欢

转载自blog.csdn.net/phoebe_16/article/details/80760558