JavaScript 实现栈和队列的操作(ES5、ES6)

本文详细介绍了栈和队列这两种重要的数据结构,通过ES5和ES6的代码实现展示了它们的基本操作,如入栈、出栈、入队、出队等。同时,给出了将10进制数转换为2进制数以及击鼓传花游戏的实例,展示了栈和队列的实际应用场景。
摘要由CSDN通过智能技术生成

文章目录

队列 是两种重要的线性结构,从数据结构的角度看,栈和队列也是 线性表,其特殊性在于栈和队列的基本操作是线性表的子集。它们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,它们是和线性表大不相同的两类重要的的抽象数据类型。

  • 所有的插入和删除操作都限制在线性表的 同一端 进行,是一种 后进先出 的线性表
  • 表尾端称栈顶,表头端称栈底

在这里插入图片描述

ES5的写法:

//定义栈的构造函数
function Stack(){  
    // 用数组来模拟栈
    let items=[];
    //将元素送入栈,放置于数组的最后一位
    this.push=function(element){
        items.push(element);
    };
    //弹出栈顶元素
    this.pop=function(){
        return items.pop();
    };
    //查看栈顶元素
    this.peek=function(){
        return items[items.length-1];
    }
    //判断栈是否为空
    this.isAmpty = function() {
        return items.length === 0
    };
    //清空栈中所有内容
    this.clear = function() {
        items = [];
    };
    //返回栈的长度
    this.size = function() {
        return items.length;
    };
    // 以字符串显示栈中所有内容
    this.print = function() {
        return items.toString();
    };
}

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];
    }
    //判断栈是否为空
    isAmpty() {
        return this.items.length === 0
    };
    //清空栈中所有内容
    clear() {
        this.items = [];
    };
    //返回栈的长度
    size() {
        return this.items.length;
    };
    // 以字符串显示栈中所有内容
    print() {
        return this.items.toString();
    };
}

实例应用: 将10进制数字转为2进制数字

原理: 就是输入要转换的数字,不断的除以二并取整。并且最后运用while循环,将栈中所有数字拼接成字符串输出。

/**
  * @param  {Number} decNumber 要转换的10进制数字
  * @return {Number}           转换后的2进制数字
*/
function divideBy2(decNumber) {
    let remStack = new Stack();
    let rem, binaryString = '';

    while (decNumber > 0) {
        rem = Math.floor(decNumber % 2);
        remStack.push(rem);
        decNumber = Math.floor(decNumber / 2);
    }
    while (!remStack.isAmpty()) {
        binaryString += remStack.pop().toString();
    }
    return binaryString;
};
console.log(divideBy2(10));

结果:
在这里插入图片描述

队列

  • 队列也是一种线性表,是一种 先进先出 的线性结构。队列只允许在表的一端进行插入(入队)、删除(出队)操作
  • 允许插入的一端称为队尾,允许删除的一端称为队头

在这里插入图片描述
ES5的写法:

//定义队列构造函数
function Queue() {
    //用数组来模拟队列
    let items = [];
    //将元素推入队列
    this.enqueue = function (ele) {
        items.push(ele);
    };
    //将队列中第一个元素弹出
    this.dequeue = function () {
        return items.shift()
    };
    //查看队列的第一个元素
    this.front = function () {
        return items[0];
    };
    //判断队列是否为空
    this.isAmpty = function () {
        return items.length === 0
    };
    //返回队列的长度
    this.size = function () {
        return items.length;
    };
    //清空队列中所有内容
    this.clear = function () {
        items = [];
    };
    //以字符串显示队列中所有内容
    this.print = function () {
        return items.toString();
    };
}

ES6的写法:

//定义队列的类
class Queue {
    constructor() {
        //用数组来模拟队列
        this.items = [];
    }
    //将元素推入队列
    enqueue(ele) {
        this.items.push(ele);
    };
    //将队列中第一个元素弹出
    dequeue() {
        return this.items.shift()
    };
    //查看队列的第一个元素
    front() {
        return this.items[0];
    };
    //判断队列是否为空
    isAmpty() {
        return this.items.length === 0
    };
    //返回队列的长度
    size() {
        return this.items.length;
    };
    //清空队列中所有内容
    clear() {
        this.items = [];
    };
    //以字符串显示队列中所有内容
    print() {
        return this.items.toString();
    };
}

实例应用: 击鼓传花的小游戏

原理: 规定输入要参与的玩家数组和击鼓次数,每次都淘汰一人,其中未被淘汰的人采用先出队列和进队列的顺序,最终剩余一人则为胜者,将其输出

/**
 * @param  {Array} nameList 参与人员列表
 * @param  {Number} num      在循环中要被弹出的位置
 * @return {String}          返回赢家(也就是最后活下来的那个)
 */
function hotPotato(nameList, num) {
    let queue = new Queue();
    for (let i = 0; i < nameList.length; i++) {
        queue.enqueue(nameList[i]);
    }
    let eliminated = '';
    while (queue.size() > 1) {
        for (let i = 0; i < num; i++) {
            queue.enqueue(queue.dequeue());//先出再入
        }
        eliminated = queue.dequeue();
        console.log(eliminated + " Get out!")
    }
    return '胜利者:' + queue.dequeue();
}

let nameList = ['小明', '小红', '小王', '小强'];
console.log(hotPotato(nameList, 3))

结果:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值