數(shù)據結構是開發(fā)人員的基礎知識,前端開發(fā)人員也要對各種數(shù)據有了解。相信理解的越深入,越能發(fā)現(xiàn)他的強大。今天先和大家介紹一下最簡單的數(shù)據結構棧。
1.棧的定義
棧是一種遵循后進先出原則的有序集合。先進入棧的元素在底部,后進入棧的元素在頂部。后進棧的元素先被取出,早進棧的元素后被取出。
是不是有點蒙圈了,別著急。你可以想像棧是一個水杯,先倒進去的水會在水杯的底部,后倒進去的水在水杯的頂部。如果想把水倒出來,那在水杯頂部的水會先被倒出來,底部的水要等上層的水離開之后才能被倒出來。
把棧想象成摞起來的書也能幫助你理解棧的結構。
2.手動實現(xiàn)一個棧
已經知道了棧的定義和特性,我們可以借助數(shù)組來實現(xiàn)一個棧。它要符合棧的特性“后進先出”,要能夠入棧和出棧。
第一步:實現(xiàn)入棧
JavaScript的數(shù)組添加元素又兩種方式:push 和 unshift。push是添加到數(shù)組的尾部及最后一個元素的后面,而unshift則是添加到數(shù)組的頭部。結合棧的特性,我們應該選擇push的方式。
var stack = {
//用數(shù)組存儲元素
items: [],
//實現(xiàn)入棧方法 add
add: function(element){
stack.items.push(element);
}
};
第二步:實現(xiàn)出棧
JavaScript移除元素的話有pop和shift,結合棧后進先出的特性,需要選擇pop來實現(xiàn)元素的出棧。pop移除并返回數(shù)組的最后一個元素。
var stack = {
//用數(shù)組存儲元素
items: [],
//實現(xiàn)入棧方法 add
add: function(element){
stack.items.push(element);
},
//實現(xiàn)出棧的方法
remove: function(){
return stack.items.pop();
}
};
到這里一個最基本的棧就實現(xiàn)了,但是往往棧還要有其他方法。下面我們再實現(xiàn)一個返回棧內元素個數(shù)的方法size。
getSize: function(){
return stack.items.length;
};
除了這些基本的方法之外,棧還可以實現(xiàn)很多功能。比如實現(xiàn)返回棧頂?shù)脑兀瑮5钠骄鶖?shù)等等。
大家有空可以思考一下如何實現(xiàn)一個棧的方法,它能夠返回棧的最小值且時間復雜度為O(1)。棧內的元素均為數(shù)字。明天晚上在下一章隊列中會給出我的解法。
個人淺薄之見,歡迎大家交流指正。