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

2021-03-04 06:11:23 字數 5022 閱讀 1898

1樓:想太多m綈

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

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

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

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

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

棧的順序儲存及其運算

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

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

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

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

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

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

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

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

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

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

2樓:匿名使用者

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

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

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

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

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

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

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

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

3樓:匿名使用者

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

4樓:匿名使用者

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

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

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

5樓:匿名使用者

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

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

6樓:匿名使用者

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

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

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

希望對你有幫助!

7樓:匿名使用者

先進後出啊

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

8樓:匿名使用者

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

9樓:匿名使用者

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

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

反之亦然

進出棧的順序

10樓:

如果進棧的順序是a,b,c,d。

問題1:那麼出棧的順序有沒有可能是a,b,c,d

答:可能 a進->a出->b進->b出->c進->c出->d進->d出(乙個資料進棧後不用等其它元素出棧就可以出棧)

問題2:出棧的順序有好多種

答:正確。n個資料進棧有(c(2n,n)/(n+1) [c(n,m)表示n選m的組合數].)種出棧方案。具體分析如下:

對於每乙個數來說,必須進棧一次、出棧一次。我們把進棧設為狀態『1』,出棧設為狀態『0』。n個數的所有狀態對應n個1和n個0組成的2n位二進位製數。

由於等待入棧的運算元按照1¨n的順序排列、入棧的運算元b大於等於出棧的運算元a(a≤b),因此輸出序列的總數目=由左而右掃瞄由n個1和n個0組成的2n位二進位製數,1的累計數不小於0的累計數的方案種數。

在2n位二進位製數中填入n個1的方案數為c(2n,n),不填1的其餘n位自動填0。從中減去不符合要求(由左而右掃瞄,0的累計數大於1的累計數)的方案數即為所求。

不符合要求的數的特徵是由左而右掃瞄時,必然在某一奇數字2m+1位上首先出現m+1個0的累計數和m個1的累計數,此後的2(n-m)-1位上有n-m個 1和n-m-1個0。如若把後面這2(n-m)-1位上的0和1互換,使之成為n-m個0和n-m-1個1,結果得1個由n+1個0和n-1個1組成的2n位數,即乙個不合要求的數對應於乙個由n+1個0和n-1個1組成的排列。

反過來,任何乙個由n+1個0和n-1個1組成的2n位二進位製數,由於0的個數多2個,2n為偶數,故必在某乙個奇數字上出現0的累計數超過1的累計數。同樣在後面部分0和1互換,使之成為由n個0和n個1組成的2n位數,即n+1個0和n-1個1組成的2n位數必對應乙個不符合要求的數。

因而不合要求的2n位數與n+1個0,n-1個1組成的排列一一對應。

顯然,不符合要求的方案數為c(2n,n+1)。由此得出 輸出序列的總數目=c(2n,n)-c(2n,n+1)=1/(n+1)*c(2n,n)

11樓:匿名使用者

如果進棧的順序是a,b,c,d。

可能 a進->a出->b進->b出->c進->c出->d進->d出(乙個資料進棧後不用等其它元素出棧就可以出棧)。

順序,順字三豎是書本的外觀象形,右邊頁字是書本內部象形,合之謂書態;序字上橫表使用腦神經,一點指右腦活動,豎撇指右半身活動;裡面的予字是內臟活動象,指左肺心胃右腹部使用中。表層意思,書被人所捕捉(勤未成年);或人被書間接捕捉(勤成年)。

12樓:蝶破焰澈

問題1,可能的。

問題2,出棧順序是很多的,例如 abdc acbd acdb cbad cbda 太多了,有空自己慢慢推哈

13樓:匿名使用者

應該是先進後出 後進先出的原則

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

14樓:匿名使用者

#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;}

資料結構順序棧的出棧問題,資料結構課程棧出棧入棧問題

selemtype為什麼要用 就是因為要用e把出棧前的棧頂元素的值帶回來。資料結構課程棧出棧入棧問題 題目中沒有給出push pop兩個函式的實現 猜測出題者的本意,應該是入棧和出棧過程中版順便給對應權變數賦值,據此,答案如下 最初x c y k push s,x c入棧,棧中只有c push s,...

關於用c語言寫的入棧和出棧程式,棧操作的問題

嗯,是你這樣理解,書上錯了 78,79行應改成top top next free p1 c語言 進棧和出棧 閒得沒事幹,跟你詳細講講吧。首先要弄明白一點,棧的結構是 先進後出 的,就像你堆積木一樣,第一根放在最底層的地面上,然後一根一根往上堆。前乙個放上去的總是被後乙個放上去的壓在底下。那我當我再想...

出棧和壓棧應如何理解,壓棧 和 出棧 是什麼意思啊 ?

堆疊是ram中劃出的一片特殊儲存區,用於臨時存放一些重要資料 這些資料存放一會後是必須回到原位的 其中資料的位置由堆疊指標確定,而資料的存放和讀取則由入棧指令和出棧指令控制,入出必須對應成對的使用才能使壓入的資料正確的回到壓入前的位置。比如 當前正在執行某程式,要呼叫乙個子程式,而子程式中會用到a ...