您好:
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了徐州免費(fèi)建站歡迎大家使用!
你是在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)方面的知識(shí)吧。
首先呢,你學(xué)習(xí)棧,要了解棧的定義,明白它是怎么一回事,就是去理解他的思想。
最后才去用代碼來體現(xiàn)出來。
棧是先進(jìn)后出,其實(shí)是用代碼控制的,
其實(shí)你要他先進(jìn)先出也可以。
你只要明白他的原理就行。
代碼,你可以理解為跟計(jì)算的一種對(duì)話的語言。
不用想的那么復(fù)雜。
就好比說話,你只要知道你要說什么就行(算法),而不用刻意明白要怎么說(語法)。
下面給我出我以前寫的代碼,關(guān)于棧的,順序棧,其實(shí)還有鏈棧。
/*???數(shù)據(jù)結(jié)構(gòu)-棧???*/
/*???異常的細(xì)節(jié)處理還沒弄好*/
#include?iostream
#include?stdlib.h
#include?malloc.h
#define?len_chu_shi?50???//初始空間大小
#define?len_zeng_jia?10??//額外增加空間大小
#define?OK?0???????//正確
#define?OVER?-2?????//
#define?ERROR?-1???//
using?namespace?std;
typedef?int?elem_type;??????????//元素類型
typedef?int?function_type;??????//函數(shù)類型
typedef?struct?zhan
{
elem_type?*top;????//棧頂
elem_type?*base;???//棧底
int?len;???????????//當(dāng)前空間大小
}zhan;????????????????//棧結(jié)構(gòu)
function_type?Init_zhan(zhan?*exam);//初始化棧
function_type?Get_top(zhan?*exam,elem_type?*e);//獲取棧頂元素
function_type?Add_top(zhan?*exam,elem_type?*e);//增加棧頂元素
function_type?Delete_top(zhan?*exam,?elem_type?*e);//刪除棧頂元素
int?main(int?argc,char?*argv[])
{
zhan?*example?=?(zhan?*)malloc(sizeof(zhan));
Init_zhan(example);
return?OK;
}
function_type?Init_zhan(zhan?*exam)
{
exam-base?=?(elem_type?*)malloc(len_chu_shi*sizeof(elem_type));
if(!exam-base)??//分配失敗
exit(OVER);
exam-top?=?exam-base;
exam-len?=?len_chu_shi;
return?OK;
}//--end
function_type?Get_top(zhan?*exam,elem_type?*e)
{
if(!exam-base)
exit(OVER);
*e?=?*(exam-top?-?1);??//不能用自減運(yùn)算符,那樣會(huì)改變棧頂指針的值
return?OK;
}//--end
function_type?Add_top(zhan?*exam,elem_type?*e)
{
if(exam-len?=?exam-top?-?exam-base)??//我個(gè)人覺得,如果?已經(jīng)"",就已經(jīng)數(shù)據(jù)溢出了,就應(yīng)該報(bào)錯(cuò)
exam-base?=?(elem_type?*)realloc(exam-base,(exam-len?+?len_zeng_jia)*sizeof(elem_type));
if(!exam-base)??//分配失敗
exit(OVER);
*(exam-top++)?=?*e;???//應(yīng)該是先改變棧頂指針的內(nèi)容,然后棧頂指針再自增
exam-len?+=?len_zeng_jia;
return?OK;
}//--end
function_type?Delete_top(zhan?*exam,?elem_type?*e)
{
if(!exam-base)??//空棧
exit(OVER);
*e?=?*(--exam-top);??//應(yīng)該是棧頂指針先自減,然后獲取棧頂指針的內(nèi)容
return?OK;
}//--end
#include
stdio.h
int
stack[100];
/*100個(gè)??臻g*/
int*
sp
=
stack;
/*棧指針指向棧底*/
#define
push(
i
)
{
*sp++
=
i;
}
/*push一個(gè)數(shù)*/
#define
pop()
(*--sp)
/*pop一個(gè)數(shù)并返回*/
int
main()
{
int
i;
for
(
i
=
0;
i
10;
++i
)/*push
0~9*/
push(
i
);
for
(
i
=
0;
i
10;
++i
)/*輸出9~0*/
printf(
"%d
",
pop()
)
;
}
C語言函數(shù)參數(shù)入棧順序從右到左是為了方便可變參數(shù)函數(shù)。
一、在函數(shù)調(diào)用時(shí),函數(shù)參數(shù)的傳遞,在C語言中是通過棧數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的。
在調(diào)用函數(shù)時(shí),先根據(jù)調(diào)用函數(shù)使用的參數(shù),自右向左依次壓入棧中,然后調(diào)用函數(shù),在函數(shù)開始執(zhí)行時(shí),將參數(shù)再依次彈棧。根據(jù)棧數(shù)據(jù)結(jié)構(gòu)先進(jìn)后出的特點(diǎn),在函數(shù)中彈棧的順序就是從左向右的。
二、對(duì)于參數(shù)固定的函數(shù),無論是從左向右還是從右向左,都沒什么區(qū)別,最終都是所有參數(shù)全部傳遞。
三、對(duì)于可變參數(shù),比如printf,會(huì)在第一個(gè)參數(shù)格式字符串中,指明后續(xù)有幾個(gè)參數(shù),各自是什么類型的。于是在函數(shù)中,參數(shù)格式字符串必須第一個(gè)彈棧,否則無法獲取參數(shù)類型,也就無法獲知后續(xù)參數(shù)占幾個(gè)字節(jié),導(dǎo)致無法正確獲知參數(shù)。
四、理論上來說,如果從左向右壓棧,可變參數(shù)標(biāo)記格式字符串的參數(shù)放在最后,那么也是可以的。 不過最早設(shè)計(jì)C語言的人采用了這種方式,后續(xù)也就延續(xù)下來了。
網(wǎng)站題目:c語言函數(shù)出入棧 c語言出棧操作
當(dāng)前URL:http://chinadenli.net/article26/dodchjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、營銷型網(wǎng)站建設(shè)、ChatGPT、靜態(tài)網(wǎng)站、網(wǎng)站維護(hù)、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)