学习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();  // ['!']

链表

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值