zoukankan      html  css  js  c++  java
  • javascript中的双向队列

    1.概念

       我们知道队列是一种先进先出的结构,只能在队伍的开头添加元素,队伍的结尾删除元素。双向队列的概念就是同时允许在队伍的开头和结尾添加和删除元素。在javascript中有一个处理数组的方法Array.splice(index, length, array)方法,这个方法先从数组中删除几个元素,再加上几个元素。这个方法的第一个参数是要从那里开始删除元素,第二个参数标识要删除多少个元素,第三个参数是要从index后面要添加进来的数组。使用splice方法可以很方便的实现在数组的任何位置添加,删除元素。在队伍开头添加元素就是从第0个元素开始删除0个元素,然后添加新的数组元素进去就好了,这是不是很简单呢。

      下面我们看看双向队列的代码实现: 

    /*--------------双向Queue类的定义和测试代码----------------*/
    function Queue(){
            this.dataStore = [];
            this.enqueueFront = enqueueFront;
            this.enqueueBack = enqueueBack;
            this.dequeueFront = dequeueFront;
            this.dequeueBack = dequeueBack;
            this.front = front;
            this.back = back;
            this.toString = toString;
            this.empty = empty;
    }
    
    //尾部入队,就是在数组的末尾添加一个元素
    function enqueueBack(element){
        this.dataStore.push(element);
    }
    
    //头部入队,就是在数组的头部添加一个元素
    function enqueueFront(element){
        this.dataStore.splice(0,0,element);
    }
    
    //尾部出队,就是删除数组的最后一个元素
    function dequeueBack(){
        return this.dataStore.splice(this.dataStore.length-1, 1);
    }
    
    //出队,就是删除数组的第一个元素
    function dequeueFront(){
        return this.dataStore.shift();
    }
    
    //取出数组的第一个元素
    function front(){
        return this.dataStore[0];
    }
    //取出数组的最后一个元素
    function back(){
        return this.dataStore[this.dataStore.length-1];
    }
    
    function toString(){
        var retStr = "";
        for (var i=0; i<this.dataStore.length; ++i) {
            retStr += this.dataStore[i] + "&nbsp;"
        }
        return retStr;
    }
    //判断数组是否为空
    function empty(){
        if(this.dataStore.length == 0){
            return true;
        }else{
            return false;
        }    
    }
    //返回数组中元素的个数
    function count(){
        return this.dataStore.length;
    }
    
    var q = new Queue();
    q.enqueueFront("1");
    q.enqueueFront("2");
    q.enqueueBack("3");
    q.enqueueBack("4");
    document.write(q.toString());
    document.write('<br>');
    
    q.dequeueFront();
    document.write(q.toString());
    document.write('<br>');
    
    q.dequeueBack();
    document.write(q.toString());
    document.write('<br>');
    document.write('<br>');

    输出结果

      

    2.判断回文

       双向队列可以从队伍的开头删除和添加元素,用这个特性来反转字符串是方便的,入队之后只要依次从对头获取元素就可以获取一个反转的字符串。这样的话我们可以很简单判断一个字符串是否是回文字符串,下面的代码就是使用双向队列判断字符串是否是回文。

    /*---------------------------判断字符串是否是回文-------------------------*/
    function isPalindrome(str){
        var queue = new Queue();
        for (var i=0; i<str.length; i++) {
            queue.enqueueFront(str[i]);
        }
        
        var newStr = "";
        while (!queue.empty()){
            newStr += queue.dequeueFront();
        }
        
        document.write(newStr);
        document.write('<br>');
        if(str == newStr){
            document.writeln(str + " 是回文");
        }else{
            document.writeln(str + " 不是回文");
        }
    }
    
    isPalindrome("racecar");
    document.write('<br>');
    isPalindrome("helloword");

    输出结果:

  • 相关阅读:
    element-ui 设置input的只读或禁用
    vue 获取后端数据打印结果undefined问题
    用yaml来编写配置文件
    [LeetCode] 28. 实现strStr()
    [LeetCode] 25. k个一组翻转链表
    [LeetCode] 26. 删除排序数组中的重复项
    [LeetCode] 24. 两两交换链表中的节点
    [LeetCode] 23. 合并K个排序链表
    [LeetCode] 21. 合并两个有序链表
    [LeetCode] 22. 括号生成
  • 原文地址:https://www.cnblogs.com/tylerdonet/p/5847628.html
Copyright © 2011-2022 走看看