1. 程式人生 > >數據結構與算法JavaScript描述——棧的使用

數據結構與算法JavaScript描述——棧的使用

相等 script nbsp 彈出 images 互轉 數字轉換 dad 反轉

有一些問題特別適合用棧來解決。本節就介紹幾個這樣的例子。 1) 數制間的相互轉換                                     可以利用棧將一個數字從一種數制轉換成另一種數制。假設想將數字n 轉換為以b 為基數的數字,實現轉換的算法如下。 技術分享 使用棧,在JavaScript 中實現該算法就是小菜一碟。下面就是該函數的定義,可以將數字轉化為二至九進制的數字: 技術分享
//============================使用Stack類====================================
/**
*    1.數制間的相互轉換
*/
function
mulBase(num, base){ var s = new Stack(); do{ s.push(num % base); num = Math.floor(num / base); }while (num > 0); var converted = ""; while(s.length() > 0){ converted += s.pop(); } return converted; } //下面展示了如何使用該方法將數字轉換為二進制和八進制數。 var num = 32;
var base = 2; var newNum = mulBase(num, base); console.log(num + " converted to base " + base + " is " + newNum); num = 125; base = 8; var newNum = mulBase(num, base); console.log(num + " converted to base " + base + " is " + newNum);
View Code

打印如下:

技術分享

2)回文                                            
回文是指這樣一種現象:一個單詞、短語或數字,從前往後寫和從後往前寫都是一樣的。 比如,單詞“dad”、“racecar”就是回文;如果忽略空格和標點符號,下面這個句子也是回文,“A man, a plan, a canal: Panama”;數字1001 也是回文。 使用棧,可以輕松判斷一個字符串是否是回文。 我們將拿到的字符串的每個字符按從左至右的順序壓入棧。當字符串中的字符都入棧後,棧內就保存了一個反轉後的字符串,最後的字符在棧頂,第一個字符在棧底。 字符串完整壓入棧內後,通過持續彈出棧中的每個字母就可以得到一個新字符串,該字符串剛好與原來的字符串順序相反。我們只需要比較這兩個字符串即可,如果它們相等,就是一個回文。 代碼: 技術分享
//============================使用Stack類====================================
/**
*    2.判斷給定字符串是否是回文
*/
function isPalindrome(word){
    var s = new Stack();
    for(var i=0; i<word.length; ++i){
        s.push(word[i]);
    }

    var rword = "";
    while(s.length() > 0){
        rword += s.pop();
    }

    if(word == rword){
        return true;
    }else{
        return false;
    }
}

//測試代碼:
var word = "hello";
if (isPalindrome(word)) {
    console.log(word + " is a palindrome.");
}else {
    console.log(word + " is not a palindrome.");
}
word = "racecar";
if (isPalindrome(word)) {
    console.log(word + " is a palindrome.");
}else {
    console.log(word + " is not a palindrome.");
}
View Code

打印:

技術分享

3)遞歸演示                                                     這裏只用棧來模擬遞歸過程。 為了演示如何用棧實現遞歸,考慮一下求階乘函數的遞歸定義。首先看看5 的階乘是怎麽定義的: 5! = 5×4×3×2×1 = 120 下面是一個遞歸函數,可以計算任何數字的階乘: 技術分享 使用棧來模擬計算5! 的過程,首先將數字從5 到1 壓入棧,然後使用一個循環,將數字挨個彈出連乘,就得到了正確的答案:120。 代碼: 技術分享
//============================使用Stack類====================================
/**
*    3. 使用棧模擬遞歸過程
*/
function fact(n){
    var s = new Stack();
    while(n > 1){
        s.push(n--);
    }

    var product = 1;
    while(s.length() > 0){
        product *= s.pop();
    }
    return product;
}

console.log(fact(5)); // 顯示120
View Code

數據結構與算法JavaScript描述——棧的使用