關於入棧,出棧指標和資料操作順序的疑問

2021-03-07 06:44:23 字數 4660 閱讀 9684

1樓:匿名使用者

樓主,堆疊是乙個抽象資料型別,規定的兩項必備的基本操作分別為入棧和出棧。這個抽象資料型別並沒規定入棧與出棧具體要怎麼實現。你問的問題已經在實現這一層面上,所以按照堆疊這種抽象資料型別的規定看,「先修改指標,然後插入資料,出棧時剛好相反」並不是必須的,這取決於你的操作的具體實現。

如果你的堆疊的實現是往上長的(就是說往頂的方向長,其實質是你的棧底是定死的不能動,入棧的東西只能不斷往上疊,這就像你在書桌上放書一樣,桌底是定死的,所以你的書只能一本一本地往上堆,往上長),計算機內部的堆疊的實現採取的就是這種模式,所以就得像你說的那樣,「先修改指標,然後插入資料,出棧時剛好相反」,因為你堆疊指標指向的總是棧頂元素,棧底不能動,所以資料入棧前要先修改指標使它指向新的空餘空間然後再把資料存進去,出棧的時候自然相反,你聯絡我上面舉的放書的例子仔細想想。

然而,如果你的堆疊的實現是往下長的(就是說你每壓乙個元素入棧,棧底就自動下移乙個元素的位置,其實質就是這種堆疊模型是乙個「無底洞」型),這個時候,你的棧頂就變成了定死的,你就可以先壓入元素,然後再修改指標。因為你的棧底是無限的,你壓入乙個元素,新的元素就取代先前的棧頂元素佔據棧頂的位置,那麼你先前的指向棧頂元素的指標這個時候就該修改讓它指向這個新的棧頂元素了。

下面的就是對「無底洞」型堆疊的一種實現的描述:

壓棧(入棧):將物件或者資料壓入棧中,更新棧頂指標,使其指向最後入棧的物件或資料。

彈棧(出棧):返回棧頂指向的物件或資料,並從棧中刪除該物件或資料,更新棧頂。

話說回來,計算機內部肯定選第一種模型,不會選第二種,因為第二種模型,每壓入乙個新的元素,都需要把之前堆疊裡的所有元素整體下移動乙個元素的位置,騰出棧頂元素的位置讓新的元素進來,這種平移可是一筆不小的開銷啊!但是並不是說「無底洞」模型就沒辦法實現了,其實它可以通過第一種模型來模擬的,每需要壓入乙個新的元素的時候,就先開闢乙個空間,資料存入這個空間,然後再修改棧頂元素指標使其指向這個新的棧頂元素。

換句話說,用鍊錶的話,只要有足夠的空間可開闢出來作為乙個節點,那麼兩種堆疊模型都能實現(當然「無底洞」型還是如我上面說的那樣用第一種模擬出來的,否則平移的工作量相當可觀),如果用陣列,由於陣列在記憶體中是連續分配出來的空間,用第一種模型更自然一些。

2樓:匿名使用者

出入堆疊和裝貨一樣的道理,怎麼說呢?你仔細想想就明白了

3樓:匿名使用者

形象的說, 棧 就是乙個上面有標籤欄的桶. 標籤欄(類似超女投票的那種)就代表指標.桶底就是棧底.

桶頂就是棧頂. 拿乙個東西準備放入桶,先要往裡面扔乙個標籤(指標定位).然後在把東西(資料)放進桶裡.

可以想象一下.後放進去的東西總是壓在前乙個東西的上面.要拿的話也是先拿最後乙個.

4樓:匿名使用者

打個比方:假如你是房東,有人要住你的房子,那他住進來前你肯定要先把房子騰空,然後讓他住進來;反之,如果你不租給他住了,肯定是要先把房客趕出去,然後再使用空出來的房子。

道理是一樣的,你把堆疊看成是房子,資料看成是房客,就會懂了。

5樓:匿名使用者

堆疊主要用於儲存臨時資料、本地變數和中斷、子程式呼叫產生後的返回位址。堆疊指標暫存器通常指向堆疊的頂部。注意堆疊的執行是從較高的儲存器位址到較低的儲存器位址。

也就是說,一條堆疊push命令會使堆疊指標減小堆疊指標指向資料sram堆疊區域中子程式和中斷堆疊被定位的位置。在任何子程式被呼叫或中斷被使能之前,位於資料sram中的這一堆疊空間必須由程式定義好。堆疊指標必須被設在0x60之上。

當使用push指令向堆疊中壓入乙個資料時,堆疊指標自動減1;而當返回位址被子程式呼叫或中斷壓入堆疊時,堆疊指標自動減2。當使用pop指令把乙個資料從堆疊中彈出時,堆疊指標自動加1;而由子程式的ret或中斷程式的reti彈出資料時,堆疊指標自動加2。

希望對你有幫助!

6樓:匿名使用者

先進後出啊

就像一次只能過乙個人的橋,先過去的肯定是最後乙個回來。

7樓:匿名使用者

2樓說的經典,就是這樣的!

8樓:匿名使用者

其實沒那麼神秘 主要是看你自己定義棧的時候是怎麼樣的有的把初始top=-1 當然是要先加再入咯 或者的top=0時候可以入再加 也可以先加再入 還有乙個問題是看你的棧頂是不是作為空的來處理

比如有些設計的時候棧頂就是空的沒有儲存資料 有的是有儲存資料的最後一點是出棧和入棧操作的對稱的前面是++top的話 後面就的top--

反之亦然

入棧、出棧指標和資料操作順序是什麼樣的?

9樓:想太多m綈

線是限定在一端進行插入與刪除的線性表。

在棧中,允許插入與刪除的一端稱為棧頂,而不允許插入與刪除的另一端稱為棧底。棧頂元素總是最後被插入的元素,從而也是最先能被刪除的元素;棧底元素總是最先被插入的元素,從而也是最後才能被刪除的元素。即棧是按照「先進後出」或「後進先出」的原則組織資料的,因此,棧也被稱為「先進後出」表或「後進先出」表。

由此可以看出,棧具有記憶作用。

通常用指標top來指示棧頂的位置,用指標bottom指向棧底。

往棧中插入乙個元素稱為入棧運算,從棧中刪除乙個元素(即刪除棧頂元素)稱為退棧運算。

棧的順序儲存及其運算

與一般的線性表一樣,在程式語言中,用一維陣列s(1:m)作為棧的順序儲存空是,其中m為棧的最大容量。s(bottom)通常為棧底元素(在棧非空的情況下),s(top)為棧頂元素。

top-0表示棧空;top=m表示棧滿。

棧的基本運算有三種:入棧、退棧與讀棧頂元素。

入棧運算入棧運算是指在棧頂位置插入乙個新元素。這個運算有兩個基本操作:道德將棧頂指標進一(即top加1),然後將新元素插入到棧頂指標指向的位置。

當棧頂指標已經指向儲存空間的最後乙個位置時,說明棧空間已滿,不可能再進行入棧操作。這種情況稱為棧「上溢」錯誤。

退棧運算退棧運算是指取出棧頂元素並賦給乙個指定的變數。這個運算有兩個基本操作:道德將棧頂元素(棧頂指標指向的元素)賦給乙個指定的變數。然後將棧頂指標退一(即top減1)。

當棧頂指標為0時,說明棧空,不可能進行退棧操作。這種情況稱為棧「下溢」錯誤碼。

讀棧頂元素讀棧頂元素是指將棧頂元素賦給乙個指定的變數。必須注意,這個運算不刪除棧頂元素,只是將的值賦給乙個變數,因此,在這個運算中,棧頂指標不會改變。

當棧頂指標為0時,說明棧空,讀不到棧頂元素。

資料結構 入棧時是先改指標還是先放元素,出棧時是先移指標還是先取元素 5

10樓:匿名使用者

我覺得這個要看抄

你設定的top指標襲是指向棧bai頂du

元素,還是棧頂元

素的下乙個位置。zhi

如果top指向棧dao頂元素,那麼入棧時應該先修改指標再放元素;

如果top指向棧頂元素的下乙個位置,那麼入棧時應該先放元素再修改指標。

11樓:亮_靜

入棧時先放元素在該指標,出棧時先取元素後移指標。

12樓:匿名使用者

push()

pop()

所以入棧是先放元素在改指標,出棧先改指標在去元素

13樓:匿名使用者

1、進復棧(push)演算法

①若top≥n時,則給製出溢位資訊,作出錯處理(進棧前首先檢查棧是否已滿,滿則溢位;不滿則作②);

②置top=top+1(棧指標加1,指向進棧位址);

③s(top)=x,結束(x為新進棧的元素);

2、退棧(pop)演算法

①若top≤0,則給出下溢資訊,作出錯處理(退棧前先檢查是否已為空棧, 空則下溢;不空則作②);

②x=s(sop),(退棧後的元素賦給x);

③top=top-1,結束(棧指標減1,指向棧頂)。

資料結構問題 寫出順序棧的入棧和出棧操作函式?老師說答案就在**中。。到底是哪一部分啊?

14樓:匿名使用者

這個圖很明顯啊,push入棧,gettop是取棧頂元素,就是出棧啦

資料結構中的順序棧的進棧和出棧問題

15樓:匿名使用者

#include

#define stacksize 100typedef char datatype;

typedef struct

seqstack;

void initstack(seqstack *s)int stackempty(seqstack *s)int stackfull(seqstack *s)void push(seqstack *s,datatype x)s->data[++s->top]=x; }datatype pop(seqstack *s)return s->data[s->top--];

} int main(void)

while(i--)

printf("%c\t",pop(&ss));

return 0;}

16樓:咕嚕子

主要就是baipush函式du和pop函式的呼叫。

首先定義乙個seqstack *型別的zhi指標並分dao配記憶體,用initstack初始化。

然後兩專個屬迴圈,乙個壓棧,乙個出棧,出棧的時候用函式stackempty判斷棧是否為空,列印出pop函式的返回值即可。

入棧出棧的問題,關於入棧,出棧指標和資料操作順序的疑問

top指向棧頂,也就是最後壓入棧的元素的後乙個空單元,所以入棧的時候需要把元素填到這個單元,再把棧頂 同樣,出棧的時候,需要把棧頂先 才能得到最後入棧的那個元素。把分給他吧 挺詳細的 我就不答了 關於入棧,出棧指標和資料操作順序的疑問 樓主,堆疊是乙個抽象資料型別,規定的兩項必備的基本操作分別為入棧...

彙編出棧入棧的順序問題,組合語言中入棧出棧問題

入棧的順序是 push ax push si出棧時 pop si pop ax 組合語言中入棧出棧問題 20 我們申請乙個空棧,然後把ax,b.你是怎麼申請的呀?你既然,申請了乙個空棧,你就應該知道,棧底,在什麼地方。也就知道,棧底,的位址,存在什麼地方。那麼你說說看,你把棧底的位址,存在什麼地方了...

資料結構入棧時是先改指標還是先放元素,出棧時是先移指標還是

我覺得這個要看抄 你設定的top指標襲是指向棧bai頂du 元素,還是棧頂元 素的下乙個位置。zhi 如果top指向棧dao頂元素,那麼入棧時應該先修改指標再放元素 如果top指向棧頂元素的下乙個位置,那麼入棧時應該先放元素再修改指標。入棧時先放元素在該指標,出棧時先取元素後移指標。push pop...