c語言棧
A. 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了,通過stock.top指針就可以訪問到棧頂,然後出棧也是同理的,ok,all over
}
B. C語言中的棧、堆是什麼
C語言中的堆和棧都是一種數據項按序排列的數據結構。
棧就像裝數據的桶或箱子
我們先從大家比較熟悉的棧說起吧,它是一種具有後進先出性質的數據結構,也就是說後存放的先取,先存放的後取。
這就如同我們要取出放在箱子裡面底下的東西(放入的比較早的物體),我們首先要移開壓在它上面的物體(放入的比較晚的物體)。
堆像一棵倒過來的樹
而堆就不同了,堆是一種經過排序的樹形數據結構,每個結點都有一個值。
通常我們所說的堆的數據結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。
由於堆的這個特性,常用來實現優先隊列,堆的存取是隨意,這就如同我們在圖書館的書架上取書。
雖然書的擺放是有順序的,但是我們想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同於箱子,我們可以直接取出我們想要的書。
(2)c語言棧擴展閱讀:
關於堆和棧區別的比喻
使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等准備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。
參考資料來源:網路-堆棧
C. C語言關於棧操作
scanf("%s %d",p,&age);
這一句有問題,變數p作為存儲地址的指針,不可以作為左值。除非是在用變數的地址初始化的時候。下面那句p="da"; 也一樣。
棧的介面函數應該加上棧為空和為滿的情況。
你應該吧age去掉,加上指向當前元素的棧指針。也就是棧頂指針。
你的代碼的意思是把name數組,age和鏈接指針作為整體來入棧和出棧,就是說一次進出都是整個的數組,數組傳遞是通過strcpy實現的。
D. 數據結構C語言 棧
肯定是你指針指向不對
太長不太想看,只給你指出一處錯誤
scanf("%d,&c1");//通過鍵盤輸入為變數c1賦值
這一句,看到啥錯誤了吧?還有你聲明了char幹嘛又用%d呢,如果用%c的時候注意這樣寫
scanf(" %c",&c1);
E. c語言中棧的定義
保存數據之用,先壓棧最後出棧,不要與系統關鍵字同名就OK
F. c語言中的棧是指什麼啊
是一種數據結構.這種結構的存取原則相當於取放盤子的過程,放的時候將盤子一個一個堆起來放,取的時候先取原先最後放入的一個,然後依次類推.即後進先出的原則.
棧有順序(數組等)和鏈式(鏈表)兩種存儲結構,它的邏輯結構實質是線性表中的一種,只是這種線性表只允許在其中一端進行存取操作.更為詳細的解釋請參考數據結構一書!
G. 什麼是C語言中的棧
棧是一種數據存儲的結構,其實跟數組,隊列的存儲方式是一樣的,主要是它有存儲的規則,就是先進後出,只在棧定操作。
也就是說數據存入一個棧,取出的是最後一個存入的數據,必須從最後一個開始取。
可參考網路和維基網路
H. C語言棧是什麼,棧在哪,需要定義嗎
棧有兩種
一種是操作系統中的
進程棧
或者線程棧
系統自動生成
不需要定義
一種是數據結構中的
需要自己實現。
I. C語言中,什麼是棧,什麼是堆
1、棧區(stack):由編譯器自動分配釋放,存放函數的參數值,局部變數等值。局部變數,任務線程函數之類的是放在(使用)棧裡面的,棧利用率高一些。其操作方式類似於數據結構中的棧。特別,棧是屬於線程的,每一個線程會有一個自己的棧。
2、堆區(heap):一般由程序員分配釋放,若程序員不釋放,則可能會引起內存泄漏。注意它和數據結構中的堆是兩回事,分配方式倒是類似於鏈表,常見的就是malloc出來的都是屬於堆區,就像固定出來的區域,到free的時候才釋放,有點類似全局的,靜態的。
(9)c語言棧擴展閱讀
棧內存是由編譯器自動分配與釋放的,它有兩種分配方式:靜態分配和動態分配。
1、靜態分配是由編譯器自動完成的,如局部變數的分配(即在一個函數中聲明一個int類型的變數i時,編譯器就會自動開辟一塊內存以存放變數i)。
2、動態分配由alloca函數進行分配,但是棧的動態分配與堆是不同的,它的動態分配是由編譯器進行釋放,無需任何手工實現。
J. C語言棧的簡單實現
#include<stdio.h>
#include<malloc.h>
//enum
bool
{false,true};
typedef
struct
Node{
int
a;
int
Number;
//在棧中的序號,棧底為0
struct
Node
*next;
}Node,*LpNode;
typedef
struct
SqStack{
Node
*top;
Node
*prev;
Node
*base;
int
length;
}*LpSqStack;
//將e的能容復制到S中並將e摧毀
bool
Node_evaluation(LpNode
S,LpNode
e,bool
M)
{
//賦值操作
//S->Number
=
e->Number;
if(M
==
true)
free(e);
return
true;
}
bool
InitStack(LpSqStack
S)
{
S->length
=
0;
S->base
=
(LpNode)malloc(sizeof(Node));
if(!S->base)
return
false;
S->top
=
S->base;
S->prev
=
S->base;
S->base->Number
=
0;
return
true;
}
bool
StackEmpty(LpSqStack
S)
{
if(S->top
!=
S->base)
return
false;
return
true;
}
bool
GetTop(LpSqStack
S,LpNode
e)
{
if(S->top
==
S->base)
return
false;
e
=
S->top;
return
true;
}
bool
Push(LpSqStack
S,LpNode
e)
{
if(!Node_evaluation(S->top,e,true))
return
false;
S->top->Number
=
S->prev->Number
+
1;
S->prev
=
S->top;
S->top
=
(LpNode)malloc(sizeof(Node));
S->prev->next
=
S->top;
S->top->next
=
NULL;
return
true;
}
bool
Pop(LpSqStack
S,LpNode
e)
{
if(S->top
==
S->base)
return
false;
if(!Node_evaluation(e,S->top,true))
return
false;
S->top
=
S->prev;
S->top->next
=
NULL;
return
true;
}
bool
Vistit(LpSqStack
S,LpNode
e,int
i)
{
LpNode
p;
p
=
S->base;
for(int
j
=
0;
j
=
i;
j++)
{
if(p->next
==
NULL)
return
false;
p
=
p->next;
}
if(!Node_evaluation(p,e,false))
return
false;
return
true;
}
int
main()
{
SqStack
a;
InitStack(&a);
LpNode
b=new
Node;
LpNode
c=new
Node;
LpNode
d=new
Node;
//free(&b);這free了你下面又賦值。。。
b->a=1;
Push(&a,c);
GetTop(&a,c);
printf("%d",c->a);
return
0;
}
棧里的內存是不能free的,你要free你就自己在堆里分配。