棧: 如何實(shí)現(xiàn)瀏覽器的前進(jìn)和后退

思路
瀏覽器的前進(jìn)和后退,我們?nèi)粘I钪袘?yīng)該接觸到很多。今天就來一起思考一下,他是如何實(shí)現(xiàn)的。如果我是一個(gè)瀏覽器開發(fā)者,那我要如何來實(shí)現(xiàn)這個(gè)功能?

如果是我的話,我可能會(huì)用兩個(gè)數(shù)組來存儲(chǔ)歷史記錄,把訪問鏈接存到一個(gè)數(shù)組里面,在點(diǎn)擊后退的時(shí)候,把后退回去的記錄放到另外一個(gè)數(shù)組里來存儲(chǔ)。這樣一來,就有2個(gè)數(shù)組了,一個(gè)數(shù)組存從哪里來arr1,一個(gè)數(shù)組存從哪里回來 arr2。
再把兩個(gè)數(shù)組里面的數(shù)據(jù),隨著“前進(jìn),后退”的行為交換數(shù)據(jù),一旦出現(xiàn)這arr1,arr2 里面都不包含的item ,就直接把a(bǔ)rr2清空,沒法后退了。

其實(shí)這里涉及到一個(gè)“?!钡母拍?。

如何理解“?!??

我很認(rèn)同老師舉的那個(gè)??,棧的行為,就有點(diǎn)像是往一個(gè)箱子里疊盤子,先放進(jìn)去的盤子,在最下面,后放進(jìn)去的盤子,在最上面。
這就是所謂的先進(jìn)先出,后進(jìn)后出 的原則。
應(yīng)該是比較好理解的。
棧 有一個(gè)特點(diǎn):他是一種操作受限的線性表,只允許從其中一段插入和刪除數(shù)據(jù)。

如何實(shí)現(xiàn)一個(gè)“?!??

在前端的眼里,實(shí)現(xiàn)棧,第一個(gè)想到的就是用數(shù)組來實(shí)現(xiàn)。他一共就有2個(gè)方法:pushpop.
那我就來試著實(shí)現(xiàn)以下下呢。嘻嘻??

 class ArraryStack {
    // 申請(qǐng)一個(gè)長度為count 的數(shù)據(jù)空間
    constructor(count) {
      this.count = count;
      this.list = [];
      this.length = 0;
    }
    push(item) {
      if (this.count === this.length) return false; // 這個(gè)時(shí)候,已經(jīng)沒有內(nèi)存存儲(chǔ)了,入棧失敗
      this.list.push(item);
      this.length++;
      
    }
    pop() {
      if (!this.length) return null; // 這個(gè)時(shí)候,棧里面已經(jīng)沒有記錄了,出棧失敗
      const lastItem = this.list.pop();
     --this.length;
      return lastItem;
    }
  }

上面我聲明了一個(gè)長度為n的一個(gè)數(shù)組,來存儲(chǔ)訪問過的數(shù)組。帶有pop 和push兩個(gè)方法,是一個(gè)比較簡易的棧的實(shí)現(xiàn)。

來分析哈這個(gè)過程的時(shí)間和空間復(fù)雜度吧

在入棧和出棧的過程中,只用了幾個(gè)臨時(shí)變量,所以空間復(fù)雜度為O(1)。時(shí)間復(fù)雜度其實(shí)也還好,由于棧只操作第一個(gè)和最后一個(gè)數(shù)據(jù),所以不管你操作多少次,他的時(shí)間復(fù)雜度都是O(1)。算是比較簡單的吧

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容