js算法入门系列2

45 阅读1分钟

1、数据结构-队列

队列是一种特殊的线性表,只允许你在头部删除元素,在尾部添加新的元素。

2、队列的方法 enqueue:从队列尾部添加一个元素 dequeue:从队列头部删除一个元素 head:返回头部的元素,注意只是看一个谁在最前面,不是删除 size:返回队列大小 clear:清空队列 isEmpty:判断队列是否为空

3、实现队列方法的代码如下:

   function Queue(){
      var items = [] //存储数据
      // 向队列尾部添加一个元素
      this.enqueue = function(item){
      	items.push(item)
      }
      // 移除队列头部的元素
      this.dequeue = function(){
      	return items.shirt()
      }
      // 返回队列的头部的元素
      this.head = function(){
      	return items[0]
      }
      // 返回队列尾部元素
      this.tail = function(){
      	return items[items.length-1]
      }
      // 返回队列大小
      this.size = function(){
      	return items.length
      }
      // 清空队列
      this.clear = function(){
      	items = []
      }
      // 判断队列是否为空
      this.isEmpty = function(){
      	return items.length == 0
      }
   }

4、小试几道练习题

4.1 约瑟夫环(普通模式),题目要求:有一个数组a[100]存放0-99,要求每隔两个数删除一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数。 代码如下:

   // 准备好数据
   var arr_list = []
   for(var i=0;i<100;i++){
   	 arr_list.push(i)
   }
   function del_ring(arr_list){
   	 // 把数组元素都放入到队列中
     var queue = new Queue();
     for(var i,i<arr_list.length;i++){
        queue.enqueue(arr_list[i])
     }
     var index = 0
     while(queue.size()!=1){
     	// 弹出一个元素,判断是否需要删除
        var item = queue.dequeue()
        index+=1
        // 每隔两个就要删除掉一个,那么不是被删除的元素就放回到队列尾部
        if(index%3 != 0){
        	queue.enqueue(item)
        }
     }
     return queue.head()
   }

4.2 斐波那契数列(普通模式),使用队列计算斐波那契数列的第n项

function fibonacci(n){
	queue = new Queue()
    var index = 0
    //先放入斐波那契数列的前两个数值
    queue.enqueue(1)
    queue.enqueue(1)
    while(index < n-2){
    	// 出队列一个元素
        var del_item = queue.dequeue()
        // 取队列头部元素
        var head_item = queue.head()
        var next_item = del_item + head_item
        // 将计算结果放入队列
        queue.enqueue(next_item)
        index += 1
    }
    queue.dequeue()
    return queue.head()
}

4.3 用队列实现栈(困难模式) 实现代码如下:

     function QueueStack(){
     	var queue1 = new Queue()
        var queue2 = new Queue()
        var data_queue = null  // 放数据的队列
        var empty_queue = null  // 空队列,备用
        
        // 确认哪个队列放数据,哪个队列做备份空队列
        var init_queue = function(){
        	//都为空,默认返回1
            if(queue1.isEmpty()){
            	data_queue = queue2
                empty_queue = queue1
            }else{
            	data_queue = queue1
                empty_queue = queue2
            }
        }
        
        // push方法
        this.push = function(item){
        	init_queue()
            data_queue.enqueue(item)
        }
        
        // top方法
        this.top = function(){
        	init_queue()
            return data_queue.tail()
        }
        
        //pop方法
        // pop方法要弹出栈顶元素,这个栈顶元素是队列的尾元素,队尾元素不能删除,我们可以把data_queue中的元素除了队尾元素之外的都移除到empty_queue中,这样data_queue中就只有队尾元素,最后移除队尾元素并返回即可实现pop
        this.pop = function(){
        	init_queue()
            while(data_queue.size() > 1){
            	empty_queue.enqueue(data_queue.dequeue())
            }
            return data_queue.dequeue()
        }
     }
     
     var q_stack = new QueueStack()

4.4 打印杨辉三角(困难模式) 使用队列打印出杨辉三角的前n行,n >= 1 实现代码如下:

function print_yanghui(n){
	var queue = new Queue()
    queue.enqueue(1)
    // 第一层for循环控制打印几层
    for(var i=0;i<n;i++){
    	var line = ''
        var pre = 0
        // 第二层循环控制打印第i层
        for(var j=0;j<i;j++){
        	var item = queue.dequeue()
            line += item + ''
            // 计算下一行的内容
            var value = item + pre
            pre = item
            queue.enqueue(value)
        }
        // 每一层最后一个数字是1,上面的循环没有计算最后一个数
        queue.enqueue(1)
        console.log(line)
    }
}
    print_yanghui(10)

周末云里雾里写了点,脑细胞损失不少,继续加油!