回覆列表
  • 1 # 使用者8388652206736

    我是這樣理解的:棧的儲存空間為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應該自減,也就是這個棧是個倒棧。

  • 中秋節和大豐收的關聯?
  • 秦始皇為什麼不去西邊找不死藥?