寫在前面
在項目中,對數組的操作還是比較常見的,有時候,我們需要模擬棧和隊列的特性才能實現需求,這里記錄一下這個知識點。
棧
棧(stack)又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。
棧是限定僅在表頭進行插入和刪除操作的線性表。
就好比:一個死胡同,前面是“此路不通”,只有一個入口,如果一隊人進入,只能隊尾變對首出去。

在js中如何模擬?
<script>
var arr = [];
for (var i = 0; i < 5; i++) {
var temp = i + 1;
arr.push(temp);
console.log(temp + " 入棧");
console.log(arr);
}
console.log('棧,先進后出');
/*
這個地方需要注意,因為在出棧的過程arr.length是變化的,每移除一個元素,arr.length就會減一
,所以需要將其賦值給一個變量
*/
var len = arr.length;
for (var i = 0; i < len; i++) {
console.log(arr.pop());
}
</script>
結果

隊列
隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。
就好比:現在這個胡同不是死胡同了,隊伍可以直接通過。
<script>
var arr = [];
for (var i = 0; i < 5; i++) {
var temp = i + 1;
arr.unshift(temp);
console.log(temp + " 插入");
console.log(arr);
}
console.log('隊列,先進先出 First In First Out');
/*
這個地方需要注意,因為在刪除的過程arr.length是變化的,每移除一個元素,arr.length就會減一
,所以需要將其賦值給一個變量
*/
var len = arr.length;
for (var i = 0; i < len; i++) {
console.log(arr.pop());
}
</script>
結果

總結
首先要明白棧和隊列的區別,然后要知道js中,入棧:push 出棧:pop方法,隊列:ushift和pop方法。
