数据结构(二)队列

队列:队列是一种先进先出(first in first out缩写为FIFO)的线性表,只允许在一端进行插入(入队)操作,在另一端进行删除(出队)操作。在队列中允许入队操作的一段成为队尾,出队那一段称为对头,如图所示,其中1被称为对头元素,3称为队尾元素。可以简单理解为排队只有前面的有买完走了你才能买完离开

除了上面定义的队列外还有一种限定性数据结构双端队列,双端队列是插入和删除限定在线性表两端进行的线性表,分为三种情况(由于时间开发应用不多而我也不会就不讨论了)

用数组对队列进行结构封装以及栈的基本操作

enqueue(element):向队列尾部添加一个(或多个)新的项。

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

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

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

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

toString():将队列中的内容,转成字符串形式

 function Queue(){
            //用来接受队列的元素
            this.arr=[];
            Queue.prototype.enqueue=function(element){
                this.arr.push(element)
            },
            Queue.prototype.dequeue=function(){
                return this.arr.shift()
            },
            Queue.prototype.front=function(){
                return this.arr[0]
            },
            Queue.prototype.isEmpty=function(){
                return this.arr.length==0
            },
            Queue.prototype.size=function(){
                return this.arr.length
            },
            Queue.prototype.toString=function(){
                var result=''
                for(var i=0;i<this.arr.length;i++){
                    result+=this.arr[i]+','
                }
                return result;
            }
        }

 

这里值得注意的是如果使用了dequeue会改变原来的队列这可能是浏览器共用一块内存的原因

 

二、循环队列(击鼓传花问题)

输入的num为每次要淘汰的人的位置,每次将已经安全的重新插入队列后面(注意这里面不能用front())

 function chuanhua(names, num) {
            var queue = new Queue();
    
            for(var i=0;i<names.length;i++){
                queue.enqueue(names[i])
            }
            var taotai;
            while (queue.size() > 1) {
                for (var i = 0; i < num - 1; i++) {
                    queue.enqueue(queue.dequeue())
                }
                taotai=queue.dequeue()
                console.log("被淘汰的是" + taotai);
            }
            return queue.dequeue()
        }
        var arr = ['a', 'b', 'c', 'd', 'e', 'f']
        chuanhua(arr, 3);

 三、优先队列

    function PriorityQueue(){
            //辅助类
            var item=[]
            var QueueItem=function(element,priority){
                this.element=element;
                this.priority=priority
            }
            this.enqueue=function(element,priority){
                var queueItem=new QueueItem(element,priority)
            var added=false;//用来做最后判断的
            for(var i=0;i<item.length;i++){ 
                //如果原来的优先级小于后插入的用splice替换掉原来的
                if(queueItem.priority>item[i].priority){
                    item.splice(i,0,queueItem)
                    added=true
                     //如果不break就会和所有数据比较
                    break
                }
            }
                if(!added)
                 //判断是否比数组中其他数大
                  item.push(queueItem)
            }
         //获取item所有里面的值
        this.getItem=function(){
            return item
        }
        }
        var pq=new PriorityQueue()
        pq.enqueue('小黑',10);
        pq.enqueue('小红',12)

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值