在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. 【转】Linux 的启动流程

    半年前,我写了<计算机是如何启动的?>,探讨BIOS和主引导记录的作用. 那篇文章不涉及操作系统,只与主板的板载程序有关.今天,我想接着往下写,探讨操作系统接管硬件以后发生的事情,也就是操 ...

  2. SDC文件模版

    # 1. Define clock create_clock -name "clk_in" -period 20ns [get_ports {clk_in}] # 2. tco c ...

  3. 激活Maven profile的几种方式

    首先简单介绍下 Maven 的 profile 是什么.对于人来说,profile 是指人的肖像,轮廓,比如论坛里每个人注册了帐号后,可以设置自己的 profile,放上照片,介绍等等.对于 Mave ...

  4. bzoj2764 基因补全

    Description 在生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对,C总与G配对.两个碱基序列能相互匹配,当且仅当它们等长,并且任 ...

  5. MVC 安装

    mvc 4 支持window xp,window 7,window 8, mvc 4 支持vs2010,vs2012 vs2012中包含mvc4; vs2010中需要安装mvc4 安装包:

  6. Maven打包web工程成WAR

    其实不一定要通过Goals:package来打war包,直接run as maven bulid也行:

  7. 在JavaScript里嵌入大量字符串常量的方法

    [转]在JavaScript文件里嵌入大量字符串常量是经常遇到的事.有时为了省事,就把一些界面的HTML和CSS直接写在JS文件里.数量少还好,多的话就密密麻麻的一坨文字,讲究美观的文艺青年们,会用大 ...

  8. bug_ _java.lang.IllegalArgumentException: View not attached to window manager

    ============= 1   view not attached to window manager 转自:http://hi.baidu.com/spare_h/blog/item/7fa3e ...

  9. Java拾穗

    1.Class.forName("com.wzh.test.loadClass"); Class.forName("com.mysql.jdbc.Driver" ...

  10. Java:过去、未来的互联网编程之王

    Java对你而言是什么?一门你大学里学过的语言?一个IT行业的通用语言?你相信Java已经为下一次互联网爆炸做好了准备么?Java 一方面为嵌入式计算做了增强,而另一方面为实时应用做了精简,本文将介绍 ...