變量作用域
作用域指在編寫的算法函數(shù)中,我們能訪問的變量榕酒。有本地變量和全局變量兩種胚膊。
var myVaribale = 'global';
myOtherVaribale = 'global';
function myFunction(){
var myVaribale = 'local';
return myVaribale;
}
function myOtherFunction(){
myOtherVaribale = 'local';
return myOtherVaribale;
}
console.log(myVariable);//'global'
console.log(myFunction());//'local'
console.log(myOtherVaribale);//'global'
console.log(myOtherFunction());//'local'
console.log(myOtherVaribale);//'local'
操作符
編程語言里都需要操作符。在JS里有算數(shù)操作符想鹰、賦值操作符紊婉、比較操作符、邏輯操作符辑舷、位操作符喻犁、一元操作符和其他操作符。
//算數(shù)操作符 //賦值操作符
+ 加法 = 賦值
- 減法 += 加/賦值(x += y) == (x = x + y)
* 乘法 -= 減/賦值(x -= y) == (x = x - y)
/ 除法 *= 乘/賦值(x *= y) == (x = x * y)
% 取余 /= 除/賦值(x /= y) == (x = x / y)
++ 遞增 %= 取余/賦值(x %= y) == (x = x % y)
-- 遞減
//比較操作符 //邏輯操作符
== 相等 && 與
=== 全等 || 或
何缓!= 不等 肢础! 非
> 大于
>= 大等于
< 小于
<= 小等于
真值假值
數(shù)值類型 轉(zhuǎn)換成布爾值
undefined false
null false
布爾值 true--true,false ---false
數(shù)字 0和NaN----false,其他都是true
字符串 空字符串為 false,其他都是true
對象 true
注:new 出來的為對象始終為true (new String('') ---- true)
相等操作符
類型(x) 類型(y) 結(jié)果
null undefined true
數(shù)字 字符串 x == toNumber(y)
布爾值 任何類型 toNumber(x) == y
字符串或數(shù)字 對象 x == toPrimitive(y)
面向?qū)ο?/h4>
創(chuàng)建普通對象有兩種方式:
1、var obj = new Object();
2歌殃、var obj = {};
創(chuàng)建完成對象:
obj = {
name:{
first:'Gandalf'
}
}
在OOP中乔妈,對象是類的實(shí)例。一個(gè)類定義了對象的特征氓皱。我們會(huì)創(chuàng)建很多類來表示算法和數(shù)據(jù)結(jié)構(gòu)。
function Book(title, pages, isbn){
this.title = title;
this.pages = pages;
this.isbn = isbn;
}
實(shí)例化這個(gè)類:
var book = new Book('title','pag','isbn');
修改對象的屬性:
book.title = 'new title';
原型里聲明和使用函數(shù):
Book.prototype.printTitle = function(){
console.log(this.title);
};
直接在類的定義里聲明函數(shù):
function Book(title, pages, isbn){
this.title = title;
this.pages = pages;
this.isbn = isbn;
this.printIsbn = function(){
console.log(this.isbn);
}
};
在原型的例子里波材,printTitle方法只會(huì)創(chuàng)建一次股淡,在Book類的所有實(shí)例中共享。如果在定義類的內(nèi)部結(jié)構(gòu)時(shí)聲明廷区,每個(gè)類的實(shí)例都會(huì)有一份該方法的副本唯灵。最好在聲明公共方法時(shí)使用基于原型的方法。
數(shù)組
創(chuàng)建斐波那契數(shù)列隙轻,第一個(gè)數(shù)字是1,第二個(gè)是2,第三項(xiàng)開始闹获,每一項(xiàng)等于前兩項(xiàng)之和:
var fibonacci = [];
fibonacci[0] = 1;
fibonacci[1] = 2;
for(var i = 2; i<20;i++){
fibonacci[i] = fibonnacci[i-1] + fibonnacci[i-2];
}
數(shù)組方法:
1学赛、array.push:往數(shù)組末尾添加任意元素
2、array.unshift:往數(shù)組首位添加任意元素
3斑匪、array.pop:刪除數(shù)組最后一位元素呐籽,并返回這個(gè)元素
4、array.shift:刪除數(shù)組第一位元素蚀瘸,并返回這個(gè)元素
5狡蝶、array.splice:往數(shù)組任意位置刪除或添加任意元素
PS: --array.splice(1,3)--- 在數(shù)組第二位刪除3項(xiàng)元素,并以數(shù)組形式返回被刪除元 素;
--array.splice(1,0,2,3,4)---往數(shù)組的第二位添加2,3,4三項(xiàng)元素,若刪除元素為 0贮勃,則返回空數(shù)組;
6贪惹、array.concat:連接2個(gè)或更多數(shù)組,并返回結(jié)果寂嘉;
7奏瞬、array.every:對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),直到返回false垫释,如果每一項(xiàng)都返回true丝格,則返回true;
PS:--array.every(function(x){
return (x % 2 == 0)
}) --------返回true 或者 false
8棵譬、array.some:該方法和every方法類似显蝌,對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果任一項(xiàng)返回true订咸,則返回true曼尊;
PS:--array.some(function(x){
return (x % 2 == 0)
}) --------返回true 或者 false
9、array.forEach:對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)脏嚷,該方法沒有返回值骆撇;
10、array.map:對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)父叙,返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組神郊;
PS:--var a = [1,2,3,4,5];
a.map(function(x){
return x +1
}) ----------返回?cái)?shù)組[2,3,4,5,6],注:a數(shù)組不變肴裙;
11、array.filter:對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)涌乳,返回該函數(shù)會(huì)返回true的項(xiàng)組成的數(shù)組蜻懦;
PS:--var a =[1,2,3,4,5];
a.filter(function(x){
return (x % 2 == 0);
}) --------返回?cái)?shù)組[2,4],a數(shù)組不變
12、array.reduce:該方法可接收一個(gè)函數(shù)作為參數(shù)和一個(gè)初始值夕晓,第一次調(diào)用函數(shù)會(huì)將初始值作為參數(shù)而非數(shù)組值宛乃,這個(gè)函數(shù)有四個(gè)參數(shù): previousValue、currentValue蒸辆、index和array征炼。這個(gè)函數(shù)會(huì)返回一個(gè)將被疊加到累加器的值,reduce方法停止執(zhí)行后會(huì)返回這個(gè)累加器躬贡。如果要對一個(gè)數(shù)組中的所有元素求和谆奥,這就很有用;
PS:--function process(previousArray,currentValue){
var nextArray;
if(currentValue >= 1 && currentValue <= 10){
nextArray = previousArray.push(currentValue);
}else{
nextArray = previousArray
}
return nextArray;
}
var numbers = [20,1,-4,6,30,5,8],emptyArray = [];
numbers .reduce(process,emptyArray);--------返回?cái)?shù)組[1,6,5,8]
13、array.reverse:反序排列數(shù)組逗宜,原先數(shù)組最后一位元素變成第一位雄右;
14、array.sort:按照字母順序?qū)?shù)組進(jìn)行排列纺讲,支持傳入指定排序方法的函數(shù)作為參數(shù)
PS: ----var numbers = [2,3,5,7,1,6,8];
numbers.sort(function(a,b){
return a-b
})-----返回numbers數(shù)組[1,2,3,5,6,7,8],a-b為升序排列擂仍,b-a為降序排列;若 a 小于 b熬甚,在排序后的數(shù)組中 a 應(yīng)該出現(xiàn)在 b 之前逢渔,則返回一個(gè)小于 0 的值,做升序排列。
15乡括、array.indexOf:返回與參數(shù)匹配的第一個(gè)元素的索引肃廓,若參數(shù)不在數(shù)組里則返回-1;
16诲泌、array.lastIndexOf:返回與參數(shù)匹配的最后一個(gè)元素的索引盲赊。
17、array.toString:把數(shù)組里的所有元素輸出為一個(gè)字符串敷扫;
PS:---var numbers = [1,2,3,4,5];
numbers.toString() ----- 返回字符串'1,2,3,4,5',不改變原數(shù)組哀蘑;
18、array.join:把數(shù)組里的所有元素用參數(shù)拼接葵第;
PS:---var numbers = [1,2,3,4,5];
numbers.join('-') ---- 返回'1-2-3-4-5',不改變原數(shù)組绘迁;
推薦資源:
1、http://www.w3schools.com/js/js_arrays.asp;
2卒密、http://www.w3schools.com/js/js_array_methods.asp缀台;
3、Mozilla的數(shù)組及其方法的頁面
4哮奇、數(shù)組庫:Underscore: http://underscorejs.org/ Lo-Dash: http://lodash.com/
棧
創(chuàng)建普通對象有兩種方式:
1、var obj = new Object();
2歌殃、var obj = {};
創(chuàng)建完成對象:
obj = {
name:{
first:'Gandalf'
}
}
在OOP中乔妈,對象是類的實(shí)例。一個(gè)類定義了對象的特征氓皱。我們會(huì)創(chuàng)建很多類來表示算法和數(shù)據(jù)結(jié)構(gòu)。
function Book(title, pages, isbn){
this.title = title;
this.pages = pages;
this.isbn = isbn;
}
實(shí)例化這個(gè)類:
var book = new Book('title','pag','isbn');
修改對象的屬性:
book.title = 'new title';
原型里聲明和使用函數(shù):
Book.prototype.printTitle = function(){
console.log(this.title);
};
直接在類的定義里聲明函數(shù):
function Book(title, pages, isbn){
this.title = title;
this.pages = pages;
this.isbn = isbn;
this.printIsbn = function(){
console.log(this.isbn);
}
};
在原型的例子里波材,printTitle方法只會(huì)創(chuàng)建一次股淡,在Book類的所有實(shí)例中共享。如果在定義類的內(nèi)部結(jié)構(gòu)時(shí)聲明廷区,每個(gè)類的實(shí)例都會(huì)有一份該方法的副本唯灵。最好在聲明公共方法時(shí)使用基于原型的方法。
創(chuàng)建斐波那契數(shù)列隙轻,第一個(gè)數(shù)字是1,第二個(gè)是2,第三項(xiàng)開始闹获,每一項(xiàng)等于前兩項(xiàng)之和:
var fibonacci = [];
fibonacci[0] = 1;
fibonacci[1] = 2;
for(var i = 2; i<20;i++){
fibonacci[i] = fibonnacci[i-1] + fibonnacci[i-2];
}
數(shù)組方法:
1学赛、array.push:往數(shù)組末尾添加任意元素
2、array.unshift:往數(shù)組首位添加任意元素
3斑匪、array.pop:刪除數(shù)組最后一位元素呐籽,并返回這個(gè)元素
4、array.shift:刪除數(shù)組第一位元素蚀瘸,并返回這個(gè)元素
5狡蝶、array.splice:往數(shù)組任意位置刪除或添加任意元素
PS: --array.splice(1,3)--- 在數(shù)組第二位刪除3項(xiàng)元素,并以數(shù)組形式返回被刪除元 素;
--array.splice(1,0,2,3,4)---往數(shù)組的第二位添加2,3,4三項(xiàng)元素,若刪除元素為 0贮勃,則返回空數(shù)組;
6贪惹、array.concat:連接2個(gè)或更多數(shù)組,并返回結(jié)果寂嘉;
7奏瞬、array.every:對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),直到返回false垫释,如果每一項(xiàng)都返回true丝格,則返回true;
PS:--array.every(function(x){
return (x % 2 == 0)
}) --------返回true 或者 false
8棵譬、array.some:該方法和every方法類似显蝌,對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果任一項(xiàng)返回true订咸,則返回true曼尊;
PS:--array.some(function(x){
return (x % 2 == 0)
}) --------返回true 或者 false
9、array.forEach:對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)脏嚷,該方法沒有返回值骆撇;
10、array.map:對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)父叙,返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組神郊;
PS:--var a = [1,2,3,4,5];
a.map(function(x){
return x +1
}) ----------返回?cái)?shù)組[2,3,4,5,6],注:a數(shù)組不變肴裙;
11、array.filter:對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)涌乳,返回該函數(shù)會(huì)返回true的項(xiàng)組成的數(shù)組蜻懦;
PS:--var a =[1,2,3,4,5];
a.filter(function(x){
return (x % 2 == 0);
}) --------返回?cái)?shù)組[2,4],a數(shù)組不變
12、array.reduce:該方法可接收一個(gè)函數(shù)作為參數(shù)和一個(gè)初始值夕晓,第一次調(diào)用函數(shù)會(huì)將初始值作為參數(shù)而非數(shù)組值宛乃,這個(gè)函數(shù)有四個(gè)參數(shù): previousValue、currentValue蒸辆、index和array征炼。這個(gè)函數(shù)會(huì)返回一個(gè)將被疊加到累加器的值,reduce方法停止執(zhí)行后會(huì)返回這個(gè)累加器躬贡。如果要對一個(gè)數(shù)組中的所有元素求和谆奥,這就很有用;
PS:--function process(previousArray,currentValue){
var nextArray;
if(currentValue >= 1 && currentValue <= 10){
nextArray = previousArray.push(currentValue);
}else{
nextArray = previousArray
}
return nextArray;
}
var numbers = [20,1,-4,6,30,5,8],emptyArray = [];
numbers .reduce(process,emptyArray);--------返回?cái)?shù)組[1,6,5,8]
13、array.reverse:反序排列數(shù)組逗宜,原先數(shù)組最后一位元素變成第一位雄右;
14、array.sort:按照字母順序?qū)?shù)組進(jìn)行排列纺讲,支持傳入指定排序方法的函數(shù)作為參數(shù)
PS: ----var numbers = [2,3,5,7,1,6,8];
numbers.sort(function(a,b){
return a-b
})-----返回numbers數(shù)組[1,2,3,5,6,7,8],a-b為升序排列擂仍,b-a為降序排列;若 a 小于 b熬甚,在排序后的數(shù)組中 a 應(yīng)該出現(xiàn)在 b 之前逢渔,則返回一個(gè)小于 0 的值,做升序排列。
15乡括、array.indexOf:返回與參數(shù)匹配的第一個(gè)元素的索引肃廓,若參數(shù)不在數(shù)組里則返回-1;
16诲泌、array.lastIndexOf:返回與參數(shù)匹配的最后一個(gè)元素的索引盲赊。
17、array.toString:把數(shù)組里的所有元素輸出為一個(gè)字符串敷扫;
PS:---var numbers = [1,2,3,4,5];
numbers.toString() ----- 返回字符串'1,2,3,4,5',不改變原數(shù)組哀蘑;
18、array.join:把數(shù)組里的所有元素用參數(shù)拼接葵第;
PS:---var numbers = [1,2,3,4,5];
numbers.join('-') ---- 返回'1-2-3-4-5',不改變原數(shù)組绘迁;
推薦資源:
1、http://www.w3schools.com/js/js_arrays.asp;
2卒密、http://www.w3schools.com/js/js_array_methods.asp缀台;
3、Mozilla的數(shù)組及其方法的頁面
4哮奇、數(shù)組庫:Underscore: http://underscorejs.org/ Lo-Dash: http://lodash.com/
棧是一種遵從后進(jìn)先出原則的有序集合膛腐。新添加的或待刪除的元素都保存在棧的末尾睛约,稱作棧頂,另一端就叫棧底依疼。在棧里痰腮,新元素都靠近棧頂而芥,就元素都接近棧底律罢。
棧的創(chuàng)建
我們創(chuàng)建一個(gè)類來表示棧:
function Stack(){};
首先,我們需要一種數(shù)據(jù)結(jié)構(gòu)來保存棧里的元素棍丐∥蠹可以選擇數(shù)組:
var items = [];
接下來,要為我們的棧聲明一些方法:
1歌逢、push(element(s)):添加一個(gè)(或幾個(gè))新元素到棧頂巾钉。
2、pop():移除棧頂?shù)脑孛匕福瑫r(shí)返回被移除的元素砰苍。
3、peek():返回棧頂?shù)脑刳甯撸粚W鋈魏涡薷模ㄟ@個(gè)方法不會(huì)移除棧頂?shù)脑刈迹瑑H僅返回它)。
4赤惊、isEmpty():如果棧里沒有任何元素就返回true吼旧,否則返回false。
5未舟、clear():移除棧里的所有元素圈暗。
6、size():返回棧里的元素個(gè)數(shù)裕膀。這個(gè)方法和數(shù)組的length屬性很類似员串。
首先,我們要實(shí)現(xiàn)的第一個(gè)方法是push昼扛。這個(gè)方法往棧里添加新元素寸齐,只添加元素到棧頂,也就是棧的末尾野揪。
this.push = function(element){
items.push(element);
};
因?yàn)槲覀兪褂昧藬?shù)組來保存棧里的元素访忿,所以我們可以使用數(shù)組里的push方法來實(shí)現(xiàn)。
接著斯稳,我們實(shí)現(xiàn)第二個(gè)方法pop海铆。這個(gè)方法主要用來移除棧里的元素。棧遵循后進(jìn)先出的原則挣惰,因此移除的是最后添加進(jìn)去的元素,所以我們可以使用數(shù)組里的pop方法來實(shí)現(xiàn)卧斟。
this.pop = function(){
return items.pop();
}
只能用push和pop方法添加和刪除棧中元素殴边,這樣一來,我們的棧自然就遵從了lifo原則珍语。
現(xiàn)在锤岸,為我們的類實(shí)現(xiàn)一些額外的輔助方法。如果想知道棧里面最后添加的元素是什么板乙,可以用peek方法是偷。
this.peek = function(){
return items[items.length-1];
}
接著要實(shí)現(xiàn)的方法是isEmpty,如果棧為空的話就返回true,否則就返回false募逞;
this.isEmpty = function(){
return items.length == 0;
}
類似于數(shù)組的length屬性蛋铆,我們也能實(shí)現(xiàn)棧的長度方法size;
this.size = function(){
return items.length;
}
最后放接,我們來實(shí)現(xiàn)clear方法刺啦,用來移除棧里所有的元素。
this.clear = function(){
items = [];
}
這樣棧就實(shí)現(xiàn)了纠脾,為了檢查棧里的內(nèi)容玛瘸,我們來實(shí)現(xiàn)一個(gè)輔助方法,叫print苟蹈,它會(huì)把棧里的元素都輸出到控制臺(tái)糊渊。
this.print = function(){
console.log(items.toString());
}
這樣,我們就完整創(chuàng)建了棧汉操!
使用棧
現(xiàn)在我們就來實(shí)現(xiàn)一個(gè)十進(jìn)制轉(zhuǎn)化成二進(jìn)制的過程:
function divideBy2(decNumber){
var remStack = new Stack(),rem,binaryString = '';
while(decNumber >0){
rem = Math.floor(decNumber % 2);
remStack.push(rem);
decNumber = Math.floor(decNumber / 2)
}
while(!remStack.isEmpty()){
binaryString += remStack.pop().toString();
}
return binaryString;
}
這樣再来,我們修改下上面的算法,就能把十進(jìn)制轉(zhuǎn)換成任何進(jìn)制磷瘤。
function baseConverter(decNumber,base){
var remStack = new Stack(),rem,baseString='',digits='0123456789ABCDEF';
while(decNumber >0){
rem = Math.floor(decNumber % base);
remStack.push(rem);
decNumber = Math.floor(decNumber / base);
}
while(!remStack.isEmpty()){
baseString += digits[remStack.pop()];
}
return baseString;
}
隊(duì)列
隊(duì)列和棧非常類似芒篷,但是使用了不同的原則,其是遵從先進(jìn)先出原則的一組有序的項(xiàng)采缚。隊(duì)列在尾部添加新元素针炉,并從頂部移除元素,最新添加的元素必須排在隊(duì)列的末尾扳抽。
隊(duì)列的創(chuàng)建
我們創(chuàng)建一個(gè)類來表示隊(duì)列:
function Queue(){};
首先篡帕,我們需要一個(gè)用于存儲(chǔ)隊(duì)列中元素的數(shù)據(jù)結(jié)構(gòu)。我們可以使用數(shù)組贸呢,就像在上一章Stack類中那樣使用:
var items = [];
接下來镰烧,我們聲明一些隊(duì)列可用的方法:
1、enqueue(element(s)):向隊(duì)列尾部添加一個(gè)(或多個(gè))新的項(xiàng)楞陷。
2怔鳖、dequeue():移除隊(duì)列的第一項(xiàng),并返回被移除的元素固蛾。
3结执、front():返回隊(duì)列中第一個(gè)元素----最先被添加度陆,也將是最先被移除的元素,隊(duì)列不做任何變動(dòng)献幔。
4懂傀、isEmpty():如果隊(duì)列中不包含任何元素,返回true蜡感,否則返回false蹬蚁。
5、clear():移除隊(duì)列里的所有算數(shù)铸敏。
6缚忧、size():返回隊(duì)列包含的元素個(gè)數(shù),與數(shù)組的length屬性類似杈笔。
首先要實(shí)現(xiàn)的是enqueue方法,這個(gè)方法往隊(duì)列里添加新元素糕非,只添加到隊(duì)列末尾:
this.enqueue = function(element){
items.push(element);
}
接下來要實(shí)現(xiàn)的是dequeue方法蒙具,這個(gè)方法刪除隊(duì)列里的第一項(xiàng):
this.dequeue = function(){
return items.shift();
}
只有enqueue方法和dequeue方法可以添加和移除元素,這樣就確保了Queue類遵從先進(jìn)先出原則朽肥。
現(xiàn)在禁筏,為我們的類實(shí)現(xiàn)一些額外的輔助方法,如果想知道隊(duì)列最前面的項(xiàng)是什么衡招,可以用front方法:
this.front = function(){
return items[0]
}
接著要實(shí)現(xiàn)isEmpty方法篱昔,如果隊(duì)列為空返回true,否則就返回false始腾。
this.isEmpty = function(){
return items.length == 0;
}
接著是size方法州刽,來獲取隊(duì)列的長度。
this.size = function(){
return items.length;
}
最后來實(shí)現(xiàn)clear方法浪箭。
this.clear = function(){
items = [];
}
這樣隊(duì)列就實(shí)現(xiàn)了穗椅,也可以像Stack類一樣增加一個(gè)print方法:
this.print = function(){
console.log(items.toString());
}
這樣,我們就實(shí)現(xiàn)了一個(gè)隊(duì)列奶栖!
優(yōu)先隊(duì)列
優(yōu)先隊(duì)列中匹表,元素的添加和移除是基于優(yōu)先級(jí)的。一個(gè)現(xiàn)實(shí)的例子就是醫(yī)院的急診宣鄙,要實(shí)現(xiàn)優(yōu)先隊(duì)列袍镀,有兩種選項(xiàng):設(shè)置優(yōu)先級(jí),然后在正確的位置添加元素冻晤;或者用入列操作添加元素苇羡,然后按照優(yōu)先級(jí)移除它們。
我們創(chuàng)建一個(gè)類來表示優(yōu)先隊(duì)列:
function PriorityQueue(){
var items = [];
//創(chuàng)建一個(gè)隊(duì)列元素類,在接下來的添加元素方法中會(huì)使用到
function QueueElement(element,priority){
this.element = element;
this.priority = priority;
}
};
接下來我們實(shí)現(xiàn)enqueue方法明也,在隊(duì)列的正確位置添加元素宣虾。
this.enqueue = function(element,priority){
var queueElement = new QueueElement(element,priority);
if(this.isEmpty()){//this指向該優(yōu)先隊(duì)列惯裕,這里直接調(diào)用判斷隊(duì)列是否為空的方法
items.push(queueElement);
}else{
var added = false;
for (var i; i<items.length;i++){
if(queueElement.priority < items[i].priority){
items.splice(i,0,queueElement);
added = true;
break;
}
}
if(!added){
items.push(queueElement);
}
}
}
這樣就完成按照優(yōu)先級(jí)在正確的位置添加元素了,優(yōu)先隊(duì)列里的元素都有優(yōu)先級(jí)該屬性绣硝,通過優(yōu)先級(jí)的判斷然后在正確的位置添加元素蜻势。我們這里實(shí)現(xiàn)的優(yōu)先隊(duì)列稱為最小優(yōu)先隊(duì)列因?yàn)閮?yōu)先級(jí)的值較小的元素被放置在隊(duì)列最前面(1代表更高的優(yōu)先級(jí))。最大優(yōu)先隊(duì)列與之相反鹉胖,把優(yōu)先級(jí)的值較大的元素放置在隊(duì)列最前面握玛。
循環(huán)隊(duì)列
循環(huán)隊(duì)列的一個(gè)例子就是擊鼓傳花游戲,在這個(gè)游戲里甫菠,孩子們圍成一個(gè)圈挠铲,把花盡快的傳遞給旁邊的人。某一時(shí)刻花停止寂诱,這個(gè)時(shí)候花在誰手里拂苹,誰就退出圓圈結(jié)束游戲。重復(fù)這個(gè)過程痰洒,直到只剩一個(gè)孩子(勝者)瓢棒。
下面,我們實(shí)現(xiàn)一個(gè)模擬的擊鼓傳花游戲:
function hotPotato (nameList,num){
var queue = newQueue();
for(var i=0;i<nameList.length;i++){
queue.enqueue(nameList[i]);
}
var eliminated = ' ';//被淘汰的對象
while(queue.size() >1){
for(var i=0;i<num;i++){
queue.enqueue(queue.dequeue());
}
eliminated = queue.dequeue();//當(dāng)i等于給定的數(shù)字num時(shí)丘喻,被淘汰的元素
}
return queue.dequeue();//最后剩下一個(gè)為勝利者
}