js中模拟队列

本文介绍了队列数据结构及其在基数排序中的应用。通过JS实现队列,并展示如何利用队列进行0-99数字的排序。此外还讨论了优先队列的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队列是一种先进先出的数据结构,队列的主要操作是向队列中插入新元素和删除队列中的元素,入队操作在队尾插入新元素,出队操作删除队头的元素。还有一个重要操作是读取队头的元素peek,底层的数据结构选用数组,这里通过使用js数组对象中shift和push方法简化代码。队列的构造函数如下:

   function Queue(){
       this.dataStore = [];
       this.enqueue = enqueue;
       this.dequeue = dequeue;
       this.front = front;
       this.back = back;
       this.toString = toString;
       this.empty = empty;
   }

方法实现

enqueue方法向队尾添加一个元素

   function enqueue(element){
       this.dataStore.push(element);
   }

dequeue方法删除队头的元素

   function dequeue(){
       this.dataStore.shift();
   }

用如下方法读取队首和队尾的元素

   function front(){
       return this.dataStore[0];
   }
   function back(){
       return this.dataStore[this.dataStore.length - 1];
   }

toString方法显示队列内元素

   function toString(){
       var str = '';
       for(var i = 0, i = this.dataStore.length; i < len; i++){
           str += this.dataStore[i] + '\n';
       }
       return str;
   }

empty判断队列是否为空

   function empty(){
       return this.dataStore.length == 0;
   }

方法使用

使用队列排序叫做基数排序,对于0-99的数字,将数据集扫描两次,第一次按照个位数上的数字进行排序,第二次按十位上的数字进行排序。

   function distribute(nums, queues, n, digit){
        //digit参数表示十位或个位上的值
        //使用十个队列临时保存排序结果,n为要排序数组长度
        //当digit=1,第一次排序后,数组在个位上有序
        //因为队列先入先出原则,第二次排序个位上数字小的在十位队列中靠前
    for(var i = 0; i < n; i++){
        digit == 1 ?
        queues[nums[i] % 10].enqueue(nums) :
        digit == 10 ? 
        queues[Math.floor(nums[i] / 10)].equeue(nums)
    }
   }
   function collect(queues, nums, n){
       //对nums数组进行改变,因为nums保存了数组的引用
       var i = 0;
       for(var j = 0; j < n; j++){
          while(!queues[j].empty()){
             num[i++] = queues[j].dequeue();
          }
       }
   }

在调用中,先创建10个队列

   var queues = [];
   //数组queues保存十个用来排序的队列
   for(var i = 0; i < 10; i++){
       queues[i] = new Queue();
   }
   //nums为要排序的数组
   var nums = [9146851592353122];
   distribute(nums, queues, nums.length, 1);
   collect(queues, nums, nums.length);
   // nums = [91, 31, 92, 22, 85, 15, 35, 46];
   distribute(nums, queues, nums.length, 10);
   collect(queues, nums, nums.length);
   //nums = [15, 22, 31, 35, 46, 85, 91, 92];

优先队列

在一般情况下,在队列中删除的元素,一定是率先入队的元素。但是有些使用队列的应用,在删除元素不想遵守这个约定,需要使用一个叫做优先队列的数据结构来模拟。这里实现一个简单的静态优先队列,如果要使用动态的优先队列可以参考我另一篇博文
从优先队列中删除元素时,需要考虑优先优先权的限制,比如银行中排队的VIP用户。

   function Rank(){
      this.name = name;
      //变量code标识重要程度
      this.vipCode = vipCode;
   }

现在重新定义dequeue方法,我们约定优先码code值最小的元素优先级最高

   function dequeue(){
       var entry = 0;
       for(var i = 1; i < this.dataStore.length; i++){
          entry = this.dataStore[i].vipCode < this.dataStore[entry].vipCode ? i : entry;
       }
       //splice方法直接改变数组
       return this.dataStore.splice(entry, 1);
   }

在使用中,将栈的基本元素通过Rank构造

    var customer1 = new Rank('John', 5);
    var customer2 = new Rank('Merry', 1);
    var queue = new Queue();
    queue.enqueue(customer1);
    ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值