在JavaScript中为数组封装了大量的方法,比如:concat,pop,push,unshift,shift,forEach等,下面我将使用JavaScript提供的这些方法,实现队列和栈的操作。

栈是一种遵从后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。

我们先创建一个表示栈的类,类名为Stock,其实这就是一个函数,在这个函数中有一个数组,这个数组用于保存栈中的数据,除了需要一个保存数据的数组之外,还需要一些对这个数组进行操作的方法,方法介绍如下:

isEmpty:判断栈是否为空

push:添加一个或者多个新的数据到栈顶

pop:移除栈顶的数据,并返回被移除的数据

size:得到栈中数据的个数

clear:清除栈中的所有数据

peek:得到栈顶的数据,但不移除

Stock类具体实现如下:

/**
* 栈类
* @constructor
*/
function Stock() {
//保存栈中的数据
this.items = [];
}
/**
* 判断是否栈中数据为空
*/
Stock.prototype.isEmpty = function(){
return this.items.length === 0;
};
/**
* 向栈顶添加一个或多个新数据
* @param elements 要添加的新数据
*/
Stock.prototype.push = function(elements){
this.items.push(elements);
};
/**
* 移除栈顶的数据,并返回移除的数据
*/
Stock.prototype.pop = function(){
return this.items.pop();
};
/**
* 得到栈中数据的个数
* @returns {Number}
*/
Stock.prototype.size = function(){
return this.items.length;
};
/**
* 得到栈顶的数据,但不移除数据
*/
Stock.prototype.peek = function(){
return this.items[this.items.length - 1];
};
/**
* 清空栈中的数据
*/
Stock.prototype.clear = function(){
this.items.length = 0;
};

使用stock类

/**
* 将十进制转换为二进制
* @param number
*/
function divideBy2(number){
var stockObj = new Stock();
var binaryStr = '';
if(number === 0){
stockObj.push(number);
}else {
while (number > 0) {
var rem = number % 2;
stockObj.push(rem);
number = number / 2 | 0;
}
}
while(!stockObj.isEmpty()){
binaryStr+= stockObj.pop();
}
return binaryStr;
}
//将十进制8转换为二进制
divideBy2(8);

队列

队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序的项。队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。

先创建一个表示队列的类,类名为Queue,与Stock类类似,也有一个表示队列中数据的数组,还有一些对数据进行操作的方法,方法的描述如下:

enqueue:向队列尾部添加一个或者多个新数据

dequeue:从队列头部移除一个数据

clear:清空队列

size:得到队列数据的个数

isEmpty:判断队列是否为空

front:得到对头的数据

Queue类具体实现如下:

/**
* 队列类
* @constructor
*/
function Queue(){
//保存队列中的数据
this.items = [];
}
/**
* 向队尾添加一个或多个新数据
* @param elements 添加的数据
*/
Queue.prototype.enqueue = function(elements){
this.items.push(elements);
};
/**
* 移除队头的数据,并返回
*/
Queue.prototype.dequeue = function(){
return this.items.shift();
};
/**
* 清空队列
*/
Queue.prototype.clear = function(){
this.items.length = 0;
};
/**
*返回队列中数据的长度
*/
Queue.prototype.size = function(){
return this.items.length;
};
/**
* 返回队头的数据,但不移除
*/
Queue.prototype.front = function(){
return this.items[0];
};

Queue的使用

/**
* 模拟击鼓传花
* @param dataList 操作的数据
* @param num 传花的间隔个数
*/
function hotPotato(dataList,num){
var queueObj = new Queue();
for(var i = 0,len = dataList.length;i<len;ii){
queueObj.enqueue(dataList[i]);
}
while(queueObj.size() === 1){ for(i = 0;i<num;i++){
queueObj.enqueue(queueObj.dequeue());
}
queueObj.dequeue(); }
console.log('取得胜利的是:',queueObj.dequeue());
}
hotPotato([1,2,3,4,22,5,6,7,8,9],4);

JavaScript数据结构,队列和栈的更多相关文章

  1. javascript数据结构与算法---栈

    javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...

  2. JavaScript数据结构与算法-栈练习

    栈的实现 // 栈类 function Stack () { this.dataStore = []; this.top = 0; // 栈顶位置 相当于length,不是索引. this.push ...

  3. JavaScript数据结构——队列的实现

    前面楼主简单介绍了JavaScript数据结构栈的实现,http://www.cnblogs.com/qq503665965/p/6537894.html,本次将介绍队列的实现. 队列是一种特殊的线性 ...

  4. JavaScript数据结构——队列的实现与应用

    队列与栈不同,它遵从先进先出(FIFO——First In First Out)原则,新添加的元素排在队列的尾部,元素只能从队列头部移除. 我们在前一篇文章中描述了如何用JavaScript来实现栈这 ...

  5. JavaScript数据结构和算法----栈

    前言 栈是一种遵循后进先出(LIFO)原则的有序集合,新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另外一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底.可以想象桌上的一叠书,或者厨房里的 ...

  6. Javascript数据结构与算法--栈的实现与用法

    栈数据结构 栈是一种遵从后进先出(LIFO)原则的有序集合.新添加的或者待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底. 我们在生活中常能看到栈的 ...

  7. javascript数据结构与算法——栈

    前言: 栈就是和列表类似的一种数据结构,不过栈的特点是'后人先出'.栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样操作很快,而且容易实现. 1. 栈的介绍: 栈是一种特殊的列表,栈内的 ...

  8. javascript数据结构——队列

    队列是一种先进先出的数据结.队列只能在队尾插入元素,在队首删除元素,这点和栈不一样.它用于存储顺序排列的数据.队列就像我们日常中的排队一样,排在最前面的第一个办理业务,新来的人只能在后面排队.队列这种 ...

  9. javascript数据结构-队列

    gihub博客地址 队列(Queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插 ...

  10. JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)

    前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...

随机推荐

  1. Python 通过print_lol将数据保存到文件中

    1. 定义一个print_lol函数来控制列表的缩进和写入位置 import sys """this is a new fuction, which work for a ...

  2. android学习笔记十——TabHost

    TabHost——标签页 ==> TabHost,可以在窗口放置多个标签页,每个标签页相当于获得了一个与外部容器相同大小的组件摆放区域. 通过此种方式可以实现在一个容器放置更多组件(EG:通话记 ...

  3. 可以返回执行结果的system函数加强版本

    在GNU Linux C编程中,要想进行系统命令的执行的话,只提供了system接口,但是此接口并不能得到命令执行后所输出的值,而只能够得到命令是否执行成功的结果.仅仅这样的功能还是不够的,有的时候是 ...

  4. 关于ORALCE一个表空间的数据导入到另一个表空间的方法(原创)

    用户:   whnaproject     所属表空间: whnaproject 新用户   : wniec            所属新表空间: wniec 要求:将用户whnaproject中的数 ...

  5. iphone dev 入门实例5:Get the User Location & Address in iPhone App

    Create the Project and Design the Interface First, create a new Xcode project using the Single View ...

  6. Flink单机版安装与wordCount

    Flink为大数据处理工具,类似hadoop,spark.但它能够在大规模分布式系统中快速处理,与spark相似也是基于内存运算,并以低延迟性和高容错性主城,其核心特性是实时的处理流数据.从此大数据生 ...

  7. Codeforces Round #369 (Div. 2) C. Coloring Trees(dp)

    Coloring Trees Problem Description: ZS the Coder and Chris the Baboon has arrived at Udayland! They ...

  8. python(8) 自己制造异常让程序退出,把print的内容写入到文件

    异常 也可以自己输出异常原因: raise Exception("404 404 404") import math import time #print 到文件的代码****** ...

  9. 控制WIFI状态

    1.控制WIFI public class MainActivity extends Activity { private Button startButton = null; private But ...

  10. Eclipse中对Python代码自动格式化!

    在Eclipse中使用PyDev发现无法进行代码格式化,使用通常的"Ctrl+Shift+F"快捷键,没有任何变化,难道不能对python代码格式化了吗? 通过下面设置,就可以每次 ...