C語言 進棧和出棧:
閑得沒事干,跟你詳細講講吧。
首先要弄明白一點,棧的結構是“先進后出“的,就像你堆積木一樣,第一根放在最底層的地面上,然后一根一根往上堆。前一個放上去的總是被后一個放上去的壓在底下。
那我當我再想里面放一根的時候,總不能放中間或者放底下吧(除非你很無聊 很寂寞 閑的蛋疼了 先一根根把堆在上面的全部拿出來 然后把要放進去的那根放上去 最后又把剛才搬下來的有重新搬上去。
此處省去幾萬字)所以要往上面加東西的時候,就得放在最上面。 以上就是進棧的原理,怎么出棧呢,很簡單,直接從”積木"的最頂端取下來就行了。
ok,以上比喻完了,希望你能看得明白。接下來講程序不說積木了:),由上面的分析 我們可以知道一個道理,對于棧的操作,棧頂的元素很重要(也就是積木最上面的那根)。
為什么呢。無論是出棧還是進棧,都跟那哥們有直接的聯系。
你想啊,如果要是有元素要進棧的話,那么它就不能當“老頂”了,那老頂之位就要交給壓在它上頭那位了;如果出棧呢,它也不能當老頂了,老頂之位就要交到原來壓在它底下的那個。 ok,所以一般的棧都將棧頂的那個元素所在的位置(內存地址--數組類型的,或者指針---節點類型的)視為棧的棧頂~!通過它來對棧進出進行操作。
一般來說(或者在我出生以來看到過的)棧有兩種內存結構(注意是是內存結構,有的書說是存儲結構,都一樣一樣滴),一種是連續的,一種是不連續的,連續的基本上就是數組了,不連續的基本上就是鏈表類型的啦。你上面的程序就是鏈表類型的,每個節點都有個指針指向它“底下”的節點(我覺得“底下”比下一個更容易理解)。
通過這種你鏈我 我鏈它的方式,把一組數據連在一起。進棧:int Push(STACK *S,int e)//進棧{ SNode *p; //step1:這個編程習慣不好,沒定義一個指針就應該把它指向NULL p=(SNode *)malloc(sizeof(SNode)); //step2:為你的節點分配內存 if(!p) return ERROR; p->data=e; //step3:當然了,你那個傳進來的e是相當于temp,用來傳值的,ok,那就把它的 數據給p咯,p實際指向的是一塊內存塊,用來裝節點的 p->next=S->top; //step4:回到上面積木問題,進棧的時候,原來的老頂要給新來的讓位,但是如果這時候的top節點直接賦給新來的元素的話,那么那個原來的老頂是不是從此以后都找不到它了?所以,先把新來的元素的next指針指向當前的老頂,這樣的話,以后通過next指針就可以找到它了。
S->top=p; //當然,都已經處理好以前老頂的身后事了(就是以后可以通過p的next指針找到它了)那么“讓位”就可以進行了,這時,p便戴上了 老頂 之帽了 S->length++; //既然人數都增加了,那就到公安局登記入戶口吧 return OK; //一切over,現在這個棧stack的棧頂位置就是你剛才新加進來的p了,通過*指針就可以訪問到棧頂,然后出棧也是同理的,ok,all over}。
判斷棧滿、進棧的語句,希望得到逐句的解釋
int stackfull(seqstack*s)
{
return (s->top==stacksize-1);
}
stacksizes=棧大小,棧從0開始,當棧頂指針=棧大小-1時,說明棧已經存滿了
void push(seqstack *s,datatype x)
{
if(stackfull(s))
error("stack verflow"); 如果出錯,進入出錯處理,不進行下一步
s->data[++s->top]=x; 棧頂指針先加1,然后再將x保存到棧頂位置
}
C語言中的出棧是什么意思
不是的,是把指針指的位置移動了。而非是刪除數據。
當把數據押入棧的時候,先移動指針,指向下一個位置,然后再押入。
當把數據押出棧的時候,先指向下一個位置,然后再押入,再移動指針。
出棧和入棧的操作順序是相反的。一個先動指針,一個先動數據。
該圖為出棧的表示圖。畫畫板畫的,粗糙了點,湊合著看吧。