【JavaScript】实现队列Queue

  • 队列只能在队首删除元素(出队),队尾增加元素(入队)
    在这里插入图片描述
//定义队列

function Queue(){
    
    
    this.dataStore = [];
    this.enqueue = enqueue;     //入队
    this.dequeue = dequeue;     //出队
    this.front = front;         //查看队首元素
    this.back = back;           //查看队尾元素
    this.toString = toString;   //显示队列所有元素
    this.clear = clear;         //清空当前队列
    this.empty = empty;         //判断当前队列是否为空
}
  • enqueque:入队操作
//向队列末尾添加一个元素,直接调用 push 方法即可

function enqueue ( element ) {
    
    
    this.dataStore.push( element );
}
  • dequeque:出队操作
//删除队列首的元素,可以利用 JS 数组中的 shift 方法

function dequeue () {
    
    
    if( this.empty() ) return 'This queue is empty';
    else this.dataStore.shift();
}
  • empty:判空操作
empty:判断队列是否为空


//我们通过判断 dataStore 的长度就可知道队列是否为空

function empty(){
    
    
    if( this.dataStore.length == 0 ) return true;
    else return false;
}
  • front:查看队首元素


//查看队首元素,直接返回数组首个元素即可

function front(){
    
    
    if( this.empty() ) return 'This queue is empty';
    else return this.dataStore[0]}

  • back:查看队尾元素
//查看队首元素,直接返回数组最后一个元素即可

//读取队列尾的元素
function back () {
    
    
    if( this.empty() ) return 'This queue is empty';
    else return this.dataStore[ this.dataStore.length - 1 ];
}
  • toString:查看队列中所有元素
//查看对了所有元素,我这里采用数组的 join 方法实现

function toString(){
    
    
    return this.dataStore.join(' ');
}
  • clear:清空当前队列
// 我们直接将 dataStore 指针清空即可

function clear(){
    
    
    delete this.dataStore;
    this.dataStore = [];
}
  • 基数排序
//基数排序

var queues = [];    //定义队列数组
var nums = [];      //定义数字数组

//选十个0~99的随机数进行排序
for ( var i = 0 ; i < 10 ; i ++ ){
    
    
    queues[i] = new Queue();
    nums[i] = Math.floor( Math.random() * 101 );
}

//排序之前
console.log( 'before radix sort: ' + nums );

//基数排序
distribution( nums , queues , 10 , 1 );
collect( queues , nums );
distribution( nums , queues , 10 , 10 );
collect( queues , nums );

//排序之后
console.info('after radix sort: ' + nums );

//根据相应的(个位和十位)数值,将数字分配到相应队列

function distribution ( nums , queues , n , digit ) {
    
      //digit表示个位或者十位的值
    for( var i = 0 ; i < n ; i++ ){
    
    
        if( digit == 1){
    
    
            queues[ nums[i] % 10 ].enqueue( nums[i] );
        }else{
    
    
            queues[ Math.floor( nums[i] / 10 ) ].enqueue( nums[i] );
        }
    }
}

//从队列中收集数字

function collect ( queues , nums ) {
    
    
    var i = 0;
    for ( var digit = 0 ; digit < 10 ; digit ++ ){
    
    
        while ( !queues[digit].empty() ){
    
    
            nums[ i++ ] = queues[digit].front();
            queues[digit].dequeue();
        }
    }
}

参考链接:
https://www.jianshu.com/p/1157aaccad36

猜你喜欢

转载自blog.csdn.net/weixin_43698328/article/details/111061866