JavaScript中的數據結構及實戰系列(2):棧

開題:算法

不冒任何險,什麼都不作,什麼也不會有,什麼也不是。

本文目錄數據結構

棧介紹:

和隊列同樣,棧也是一種表結構,可是和隊列的「先進先出」不一樣的是棧是「先進後出」的一種數據結構,它更像咱們生活中向箱子裏放東西,後放的在上面,最早被咱們取出來。this

因爲棧是「先進後出」的結構,因此咱們基本上都是對棧頂元素的操做,任何不在棧頂的元素都不能被訪問,爲了獲得棧底的元素,咱們須要刪除棧頂的元素。3d

由以上可知,「出棧」和「入棧」操做是棧中主要的兩個功能, 咱們還須要設置top做爲整個棧的指針,當向棧中壓入元素時,該變量增大,指向最新的元素,有元素出棧時,該變量減少,指向如今的棧頂元素。咱們可能只但願訪問棧頂元素,並不想將它移出棧因此咱們又須要一個getTop方法,再加上clear清除全棧、empty棧是否爲空和length獲取棧長度的方法基本上就知足了咱們對於棧的使用須要。指針

JavaScript實現棧:

function Inn(){
        var items = [];
        var top = 0;

        //入棧
        this.push = function(obj){

            items[top++] = obj;
        };

        //獲取棧頂元素並刪除
        this.pop = function(){
            
            return items[--top];
        };
        
        //獲取棧頂元素但不刪除
        this.getTop = function(){
            
            return items[top -1];
        };
        
        //清除棧數據
        this.clear = function(){
            
            top = 0;
        };
        
        //獲取棧的長度
        this.length = function(){
            return top;
        };

        //棧是否爲空
        this.empty = function(){
            return top === 0;
        };
    }

    var i  = new Inn();
    i.push({
        a: 1,
        b: 2
    });

    i.push({
        c: 3,
        d: 4
    });

    console.log(i.length());
    console.log(i.pop());
    console.log(i.getTop());
    console.log(i.length());
    i.clear();
    console.log(i.length());

輸出結果爲:code

2
    {c: 3, d: 4}
    {a: 1, b: 2}
    1
    0

棧的應用:

實現一個優秀的算法須要一個好的數據結構來支撐,所以咱們能夠用棧來作好多事情,例如咱們作ACM時的判斷迴文blog

1. 用棧判斷迴文

把相同的詞彙或句子,在下文中調換位置或顛倒過來,產生首尾迴環的情趣,叫作迴文,也叫回環。(取自百度百科)
咱們只考慮文字對應位置顛倒的狀況,即文字從前日後和從後往前寫都是同樣的狀況。好比單詞「dad」,「racecar」就是迴文;數字1001也是迴文。隊列

使用棧能夠比較輕鬆的去判斷一個字符是不是迴文。咱們能夠將文字從左往右依次壓入棧中,而後將將棧中數據依次彈出造成一個新的字符串,最後判斷兩個字符串是否相等便可。ip

function Inn(){
        var items = [];
        var top = 0;

        //入棧
        this.push = function(obj){

            items[top++] = obj;
        };

        //獲取棧頂元素並刪除
        this.pop = function(){
            
            return items[--top];
        };
        
        //獲取棧頂元素但不刪除
        this.getTop = function(){
            
            return items[top -1];
        };
        
        //清除棧數據
        this.clear = function(){
            
            top = 0;
        };
        
        //獲取棧的長度
        this.length = function(){
            return top;
        };

        //棧是否爲空
        this.empty = function(){
            return top === 0;
        };
    }

    var inn  = new Inn();
    var palindrome = '柳庭風靜人眠晝,晝眠人靜風庭柳';

    for (var i = 0; i < palindrome.length; i++) {
        inn.push(palindrome[i]);
    }

    var palindrome2 = '';

    while(!inn.empty()){
        palindrome2 +=inn.pop();
    }

    if (palindrome == palindrome2) {
        console.log('這是一個迴文字符串');
    }else{
        console.log('這不是一個迴文字符串');
    }

輸出結果爲:字符串

這是一個迴文字符串

2. 用棧實現進制轉換

在進行實現轉換時咱們先看一下咱們十進制轉換爲二進制的圖

咱們假設將數字n轉換爲以b爲基數的數字,實現步驟以下:

  1. 最高位爲n%b, 將結果壓入棧中
  2. 使用n/b 代替n
  3. 重複 一、 2直到n爲0且沒有餘數
  4. 將棧中的數據依次彈出直到棧爲空,依次將這些數據拼接,就獲得了這個以b爲基數的數字的字符串形式
function Inn(){
        var items = [];
        var top = 0;
        this.push = function(obj){

            items[top++] = obj;
        };

        this.pop = function(){
            
            return items[--top];
        };

        this.getTop = function(){
            
            return items[top -1];
        };

        this.clear = function(){
            
            top = 0;
        };

        this.length = function(){
            return top;
        };

         //棧是否爲空
        this.empty = function(){
            return top === 0;
        };
    }
    
    /******* 進制轉換 *******/
    var n =  4396;
    var inn = new Inn();
    do{
        inn.push(n % 2);
        n = Math.floor( n / 2 );

    }while(n > 0);

    var n22 = '';
    while(!inn.empty()){
        n22 += inn.pop();
    }
    console.log(parseInt(n22));

輸出結果爲:

1000100101100
相關文章
相關標籤/搜索