JavaScript資料結構之棧結構
阿新 • • 發佈:2021-01-18
JavaScript資料結構之棧結構
前言
隨著前端的興起,JavaScript這門語言也越來越受歡迎。接下來,讓我們瞭解一下如何使用JavaScript來寫資料結構中的棧結構吧!
一、棧結構是什麼?
陣列是一個線性結構,並且可以在陣列的任意位置插入和刪除元素。而棧就是比較常見的受限的線性結構。無論是插入或是刪除只能在棧頂進行操作。在棧中插入操作被稱為壓棧或是入棧,刪除操作被稱為出棧或是退棧。 棧的特點為先進後出,後進先出(LIFO:last in first out)。
二、常見的棧結構使用:函式呼叫棧、遞迴等。
函式呼叫棧:如A函式中呼叫了B函式,B函式中又呼叫了C函式,這樣在呼叫A函式時先將A函式壓入棧,由於A函式中呼叫了B函式,所以將B函式再壓入棧,以此類推,c函式也壓入棧。這時棧頂是C函式,只有C函式執行完出棧後,B函式才能執行出棧,最後A函數出棧。這就是函式呼叫棧。
遞迴:遞迴是在函式內部呼叫自身,原理和函式呼叫棧類似。
三、棧的常見操作
push(element):新增一個新元素到棧頂位置;
pop():移除棧頂的元素,同時返回被移除的元素;
peek():返回棧頂的元素,不對棧做任何修改(該方法不會移除棧頂的元素,僅僅返回它);
isEmpty():如果棧裡沒有任何元素就返回true,否則返回false;
size():返回棧裡的元素個數。這個方法和陣列的length屬性類似;
toString():將棧結構的內容以字串的形式返回。
四、使用步驟
1.建立Stack類:
function Stack() {
// 以陣列形式儲存棧資料
this.items = [];
// (不推薦!!!因為在Stack物件新增方法,其他物件無法複用)
// this.push = function (element) {
// this.item.push(element);
// }
// 在Stack類新增方法,可以使多物件複用
// 入棧
Stack.prototype.push = function (element) {
this.items.push(element);
}
// 判斷是否為空
Stack.prototype.isEmpty = function () {
return this.items.length == 0;
}
// 出棧
Stack.prototype.pop = function () {
return this.items.pop();
}
// 檢視棧頂元素
Stack.prototype.peek = function () {
return this.items[this.items.length - 1]
}
// 獲取棧中元素個數
Stack.prototype.size = function () {
return this.items.length;
}
// 以字串形式輸出元素
Stack.prototype.toString = function () {
// 加上空字串隱式轉換成字串
let result = '';
for (let i of this.items) {
// 加上' '可以在元素中以空格隔開
result += i + ' ';
}
return result;
}
// 以上程式碼也可以寫成ES6箭頭函式形式如:
// Stack.prototype.push = (element) => {
// this.item.push(element);
// }
}
2.使用棧:
let s = new Stack();
// 將資料壓入棧
s.push(10);
s.push(20);
s.push(30);
s.push(40);
// 將棧頂元素出棧(40出棧)
console.log(s.pop());
// 檢視棧頂元素(30)
console.log(s.peek());
// 檢視棧是否為空(false,目前棧還有3個元素)
console.log(s.isEmpty());
// 檢視棧元素個數(3)
console.log(s.size());
// 轉化成以空格隔開的字串形式(10 20 30)
console.log(s.toString());
控制檯:
總結
看了這些,你是否對棧結構有了一定認識呢?
由於自身水平有限,本篇文章僅代表個人理解,如有錯誤,歡迎指正!與君共勉!