首頁>Club>
3
回覆列表
  • 1 # 用戶3759948561133955

    我是這樣理解的:棧的存儲空間為S(1:m),表示有一個棧(stack),這個棧在假想的內存中分配了1到m這一段的空間。

    這裡的1和m是表示內存的一塊地方。1表示內存裡面用來存放第一個數據的地方。2就是第二塊地方,以此類推。。。因此棧中一共有30個地方來存放最多30個數據。

    這裡的1和m就是一個標號。也叫下標,可以用來索引棧中存放的數據,所以用s[1]表示棧中第一個元素(數據)。

    當你要實現一種數據結構的時候。你就要考慮兩方面。一方面是如何存儲,另一方面是它支持啥操作,如何在邏輯上實現這些操作。

    棧就像一個杯子,只能進不能出。所以先進去的會在後面出來(這裡不考慮流體)。所以棧有兩種操作入棧(push)和出棧(也可叫彈出)(pop)。

    第一點如何存儲,我們就採用線性表(linear list)來存。線性表的特點就是數據串在一條線上,上一個挨著下一個。典型的就是數組,如果不知道數組,你可以想象成一些數據穿成一串。

    接下來是它支持的操作。如何實現出棧和入棧呢?假如棧裡有數據。要實現出棧就得把棧裡面最上面的東西拿出來。那我就得知道最上面的是啥。這就是top。top本質上和1到m一樣,是一個索引,用來指示棧頂元素並且可以引用元素。所以我就可以用S[top]來得到棧頂元素。這樣棧頂元素被取出。取出後棧頂就不再是top。又由於它是線性表,所以取出後可以移動top向下讓top可以索引到新的棧頂。

    入棧剛好相反,如果要在杯子中裝入一個數據,就要在最上面

    再放

    上一個數據。因此top向上移動,此時top指向新的棧頂。並且將新數據存入S[top]。

    top始終用來指示棧頂的元素。這就不得不考慮兩種特殊情況。棧滿和棧空。

    棧滿時,top處在線性表的邊界

    ,再存入數據就要存到外面去了。因此

    要判斷top是否已經到達了棧頂

    。當棧空時,棧內沒有數據,不能再彈出數據。top自然不能再指向存儲空間內(1,m)的任意一個元素。那他應該指向何方?

    它應該指向存儲空間外的一個區域,顯然當只有一個數據在棧中,top應該按照原來出棧的方向移動(就是存入數據時移動的相反方向,也是棧開口的相反方向,也就是使勁往棧底裡鑽)。

    所以棧空時top雖然可以指向任意一塊存儲空間外的區域。但是指向棧底向外的臨近一個,這樣入棧時top往棧頂方向移動一個,出棧後棧空時,往棧底方向移動一個。就很方便。

    需要說明的是top還有兩種類型,一種是指向即將壓入的元素,一種是指向最近壓入的元素。但無論如何,初始狀態top=m+1指向存儲區間外,所以初始狀態是棧空。而且還是top指向最近壓入元素的那種棧空。並且由於棧空是m+1,入棧時候top應該自減,也就是這個棧是個倒棧。

  • 中秋節和大豐收的關聯?
  • 遇的音序是哪個字母?