JavaScript数据结构,队列和栈
在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数据结构,队列和栈的更多相关文章
- javascript数据结构与算法---栈
javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...
- JavaScript数据结构与算法-栈练习
栈的实现 // 栈类 function Stack () { this.dataStore = []; this.top = 0; // 栈顶位置 相当于length,不是索引. this.push ...
- JavaScript数据结构——队列的实现
前面楼主简单介绍了JavaScript数据结构栈的实现,http://www.cnblogs.com/qq503665965/p/6537894.html,本次将介绍队列的实现. 队列是一种特殊的线性 ...
- JavaScript数据结构——队列的实现与应用
队列与栈不同,它遵从先进先出(FIFO——First In First Out)原则,新添加的元素排在队列的尾部,元素只能从队列头部移除. 我们在前一篇文章中描述了如何用JavaScript来实现栈这 ...
- JavaScript数据结构和算法----栈
前言 栈是一种遵循后进先出(LIFO)原则的有序集合,新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另外一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底.可以想象桌上的一叠书,或者厨房里的 ...
- Javascript数据结构与算法--栈的实现与用法
栈数据结构 栈是一种遵从后进先出(LIFO)原则的有序集合.新添加的或者待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底. 我们在生活中常能看到栈的 ...
- javascript数据结构与算法——栈
前言: 栈就是和列表类似的一种数据结构,不过栈的特点是'后人先出'.栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样操作很快,而且容易实现. 1. 栈的介绍: 栈是一种特殊的列表,栈内的 ...
- javascript数据结构——队列
队列是一种先进先出的数据结.队列只能在队尾插入元素,在队首删除元素,这点和栈不一样.它用于存储顺序排列的数据.队列就像我们日常中的排队一样,排在最前面的第一个办理业务,新来的人只能在后面排队.队列这种 ...
- javascript数据结构-队列
gihub博客地址 队列(Queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插 ...
- JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)
前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...
随机推荐
- SPOJ #2 Prime Generator
My first idea was Sieve of Eratosthenes, too. But obviously my coding was not optimal and it exceede ...
- FDATool使用
1. 幅值有两种单位可选,linear和db.切换单位时Toolbox的图例会跟着变化,可以看出两种单位下参数含义不太一样. 线性坐标:例如设置为0.01/0.01,表示通带幅度0.99~1.01,阻 ...
- centos7开机/etc/rc.local不执行的问题
最近发现centos7 的/etc/rc.local不会开机执行,于是认真看了下/etc/rc.local文件内容的就发现了问题的原因了 #!/bin/bash# THIS FILE IS ADDED ...
- 6.25$post('',function(){});无法触发问题
试了很久,发现把这个方法放错位置了
- 【Linux】系统 之 RAID
本人从事DBA相关的工作,最近遇到了IO抖动伴随shread running抖动的情况,主机宕机重启后备库及下游解析binlog出现损坏的案例,向一些有经验的同事咨询学习,其中最大的嫌疑是:raid卡 ...
- activiti自定义流程之自定义表单(三):表单列表及预览和删除
注:(1)环境配置:activiti自定义流程之自定义表单(一):环境配置 (2)创建表单:activiti自定义流程之自定义表单(二):创建表单 自定义表单创建成功,要拿到activiti中使用,自 ...
- java工程师分享:我是如何自学成才的?
原文:http://www.java800.com/peixun-79062115.html 我是10年河南工业大学的毕业生,当时我们专业许多学生都去报了java培训机构,去达内的都不少.我也想去培训 ...
- Mysql讲解数据库并发控制知识
1.下载Mysql并安装,我喜欢不用安装的zip版,cd到bin目录下,先修改下mysql的密码. mysqladmin -u root -p password mysql ,第一次运行并修改mysq ...
- C# ASP.NET 开发指引简要
推荐学习交流社区:博客园http://www.cnblogs.com/ 里面有很多技术.职业圈子等信息的分享,新手必逛社区. 电子书等资源下载:csdn下载 http://download.csdn. ...
- Shell_Oracle Erp和其他系统Interface资料传输通过Shell进行控制(案例)
2014-06-26 Created By BaoXinjian