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");

输出结果:

javascript中的双向队列的更多相关文章

  1. javascript中的双向绑定

    阅读目录 一:发布订阅模式实现数据双向绑定 二:使用Object.defineProperty 来实现简单的双向绑定. 前言: 双向数据绑定的含义:可以将对象的属性绑定到UI,具体的说,我们有一个对象 ...

  2. collections之deque【双向队列】与Queue【单向队列】

    今天来向大家介绍两个队列,一个是deque,双向队列,另外一个是Queue,单向队列,队列和堆栈不同,队列为先进先出,大家还需要注意一下,双向队列为collections模块中的类,而Queue为qu ...

  3. JavaScript中的算法之美——栈、队列、表

    序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...

  4. javascript中的队列结构

    1.概念 队列和栈结构不同,栈是一种后进先出的结构,而队列是一种先进先出的结构.队列也是一种表结构,不同的是队列只能在队尾插入元素,在队首删除元素,可以将队列想象成一个在超时等待排队付钱的队伍,或者在 ...

  5. stl中双向队列用法

    双向队列的操作如下: d[i]:返回d中下标为I的元素的引用. d.front():返回的一个元素的引用. d.back():返回最后一个元素的引用. d.pop_back():删除尾部的元素.不返回 ...

  6. javascript中的栈、队列。

                           javascript中的栈.队列 栈方法     栈是一种LIFO(后进先出)的数据结构,在js中实现只需用到2个函数 push()  接受参数并将其放置 ...

  7. 剑指offer:按之字形打印二叉树(栈|双向队列+中序遍历)

    1. 题目描述 /** 请实现一个函数按照之字形打印二叉树, 即第一行按照从左到右的顺序打印, 第二层按照从右至左的顺序打印, 第三行按照从左到右的顺序打印, 其他行以此类推. */ 2. 双向队列 ...

  8. JavaScript中async和await的使用以及队列问题

    宏任务和微任务的队列入门知识,可以参考之前的文章: JavaScript的事件循环机制 宏任务和微任务在前端面试中,被经常提及到,包括口头和笔试题 async && await概念 a ...

  9. 多线程编程学习六(Java 中的阻塞队列).

    介绍 阻塞队列(BlockingQueue)是指当队列满时,队列会阻塞插入元素的线程,直到队列不满:当队列空时,队列会阻塞获得元素的线程,直到队列变非空.阻塞队列就是生产者用来存放元素.消费者用来获取 ...

随机推荐

  1. android https正确调用方案(防中间人劫持)

    以下内容为原创,欢迎转载,转载请注明 来自博客园:http://www.cnblogs.com/joey-hua/p/4971380.html 1.劫持https接口 很多android客户端虽然使用 ...

  2. 【即时通讯】XMPP调试与简单使用

    上篇讲了[即时通讯]即时通讯及XMPP概述及环境配置,接下来我们就要进行调试,看看是否可用! 在测试之前我们需要先事先保存一些东西,以便后面使用 —— 登录openfire后台 ——获取服务器名和端口 ...

  3. Android JNI简介

    JNI简介 JNI (Java Native Interface),Java的本地接口 JNI是Java众多开发技术中的一门,意在利用本地代码,为Java程序提供 更高效,更灵活的拓展.应用场景包括: ...

  4. 【代码笔记】iOS-判断有无网络

    一,工程图. 二,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIVi ...

  5. 【代码笔记】iOS-点击出现选择框

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

  6. 配置Kotlin环境(DataBinding)

    1.安装Kotlin插件 在plugin中搜索kotlin,安装两个kotlin插件,重新启动Android Studio.2.build.gradle(project level) buildscr ...

  7. apache 虚拟ip

    参考 http://blog.sina.com.cn/s/blog_5d8ca1e90100hnpv.html <VirtualHost 127.0.0.1:80>      Docume ...

  8. ruby + watir 自动化上传图片文件解决方案

    watir自动化捕获上传图片元素: require 'watir' include Watir require 'test/unit' class TC_recorded < Test::Uni ...

  9. CSS Float 以及相关布局模式

    float 取值 属性 值 描述   left 向左浮动   right 向右浮动   none 默认值   inherit 继承 看一个栗子 红色线框代表父元素 脱离文档流,其实也没有完全脱离,会被 ...

  10. mvc 开发razor模式注意事项

    1 情景为:mvc模式开发的.cshtml画面,里面有@if语句,if语句里面还有其他的代码,画面总是报错:if模块中没有对应的"}",什么问题 跟踪了之后,判定cs语句没问题,那 ...