媒介
棧是一種高效的數據構造,因為數據只能在棧頂增加或刪除,所以如許的操縱很快且很輕易完成。
一、什麼是棧
棧是一種特別的列表,棧內的元素只能經由過程列表的一端接見,這一端稱之為棧頂。
棧被稱為一種后入先出(LIFO,last-in-first-out)的數據構造。
因為棧具有后入先出的特性,所以任何不在棧頂的元素都無法接見,我們必須先拿掉上面的元素才接見其棧底的元素。
對棧的重要操縱是將一個元素壓入棧和將一個元素彈出棧,入棧運用push()
要領,出棧運用pop()
要領。
二、組織棧數據構造
我們將運用JavaScript完成棧構造,各部分功用運用解釋申明。
存儲數據我們運用的是數組。
/**
* Stack 組織要領
*/
function Stack () {
this.dataStore = []
this.top = 0
this.push = push
this.pop = pop
this.peek = peek
this.clear = clear
this.length = length
}
/**
* push() 該要領用於向棧壓入元素
* 向棧中壓入一個新元素,將其保留在數組中變量top所對應的位置
* 然後將 top + 1 讓其指向數組中下一個空位置
* @param {*} element
*/
function push (element) {
this.dataStore[this.top++] = element
}
/**
* pop() 該要領用於從棧頂推出元素
* 返回棧頂元素,同時將變量top - 1
*/
function pop () {
return this.dataStore[--this.top]
}
/**
* peek() 該要領用於返回數組的第 top - 1 個位置的元素
*/
function peek () {
return this.dataStore[this.top - 1]
}
/**
* length() 該要領用於獵取棧的長度
* 返回當前top值即可取得棧內元素個數
*/
function length () {
return this.top
}
/**
* clear() 該要領用於清空棧
* 將top設為0
*/
function clear () {
this.top = 0
}
三、棧的運用
數制間的互相轉換
我們能夠應用棧將一個数字從一種數制轉換為另一種數制。
假定想將数字n轉換為以b為基數的数字,完成的算法以下:
- 最高位為 n%b,將此位壓入棧。
- 運用 n/b 替代n。
- 反覆步驟1和2,直到n即是0,且沒有餘數。
- 延續將棧內元素彈出,直到棧空,順次將這些元素分列即可。
此算法只針對基數為2-9的狀況
代碼完成以下:
function mulBase (num, base) {
let s = new Stack()
do {
s.push(num % base)
num = Math.floor(num /= base)
} while (num > 0) {
let converted = ''
while (s.length() > 0) {
converted += s.pop()
}
return converted
}
}
迴文
運用棧,我們能夠推斷一個字符串是不是為迴文。
字符串完全壓入棧內后,經由過程延續彈出棧中的每個字母就能夠獲得一個新的字符串,該字符串恰好與本來的字符串遞次相反。我們只需要比較兩個字符串即可。假如相稱,就是一個迴文。
function isPalindrome (word) {
let s = new Stack()
for (let i = 0; i < word.length; ++i) {
s.push(word[i])
}
let rword = ''
while (s.length() > 0) {
rword += s.pop()
}
if (word == rword) {
return true
} else {
return false
}
}
結束語
以上就是對JavaScript完成棧的引見。
參考資料:數據構造與算法JavaScript形貌 第4章 棧