在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. 黄聪:chrome扩展开发《AJAX请求》

    chrome在一次更新之后,出于安全考虑,完全的禁止了content_script从https向http发起ajax请求,即使正常情况下也会在console里给出提示.这对于WEB来讲是好事,但对于扩 ...

  2. NSString类的相关用法

    一.NSString字符串连接NSString* string; // 结果字符串 NSString* string1, string2; //已存在的字符串 1. string = [NSStrin ...

  3. [OpenGL ES 03]3D变换:模型,视图,投影与Viewport

    [OpenGL ES 03]3D变换:模型,视图,投影与Viewport 罗朝辉 (http://blog.csdn.net/kesalin) 本文遵循“署名-非商业用途-保持一致”创作公用协议 系列 ...

  4. NSMutableAttributedString 设置不同颜色,不同字体的String

    UILabel *infoLabel = [[UILabel alloc]initWithFrame:CGRectMake(95, 20, 190, 70)]; infoLabel.backgroun ...

  5. Python基础09 面向对象的进一步拓展

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们熟悉了对象和类的基本概念.我们将进一步拓展,以便能实际运用对象和类. 调用类的 ...

  6. ubuntu 16.04 64bit安装 Julia

    sudo add-apt-repository ppa:staticfloat/juliareleases sudo add-apt-repository ppa:staticfloat/julia- ...

  7. Opensturt和Struct区别

    1 OpenStruct和Struct区别,Opestruct你需要创建时,直接给属性赋值,而Struct需要先定义属性后 ,再给属性赋值.选择哪个就看你对属性赋值的时机, 2 Struct和Open ...

  8. [ActionScript 3.0] AS3 绘制正二十面体(线条)

    分析: 正二十面体共有12个顶点.30条棱,其20个面都是正三角形.每条棱所对应的弧度值为1.1071487177940904弧度,这个弧度值可通过求Math.sqrt(5)/5的反余弦值求得.正二十 ...

  9. JqGrid单选

    You have to do some more stuff: 1. Set multiboxonly to true and multiselect to true 2. Define the ev ...

  10. 从linux内核代码分析操作系统启动过程

    朱宇轲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 在本次的实验中, ...