當前位置:首頁 » 編程語言 » c語言棧函數

c語言棧函數

發布時間: 2024-08-04 18:47:12

❶ 用c語言編寫函數實現順序棧的進棧、退棧、取棧頂的演算法

#include<stdio.h>
#define stacksize 100 //假定預分配的棧空間最多為100 個元素
typedef char elementtype; //假定棧元素的數據類型為字元 ,在此處可以自行設置
typedef struct
{
elementtype data[stacksize];
int top;
}seqstack;
// 置空棧
void initstack(seqstack *s)
{
s->top=-1;
//解釋一下,s->top 指向的是當前棧頂元素的位置
//當要向棧中添加一個新元素時,要先將s->top增加1,
//此時s->top 指向的就是新元素要添加的位置了。
//所以當棧為空時,填加第一元素時,top加1 後
//s->top的值就變為0,也就是第一個元素的位置了。
}
//判棧空
int stackempty(seqstack *s)
{
if(s->top==-1)
return 1; //若相等就返回1,否則為0
else return 0;
}
//入棧
void push(seqstack *s,elementtype x)
{
if(s->top==stacksize -1 ) //進棧前判斷棧是否已經滿了
printf(" stack overflow\n");
else
{
s->top= s->top + 1;
s->data[s->top]=x;
}
}
//出棧
elementtype pop(seqstack *s)
{
if(stackempty(s)) //出棧前先判斷當前棧中是否有內容
printf("stack is empty\n");
else
{
return s->data[s->top--]; //出棧後s->top的值會自減1
}
}
//取棧頂元素(只是想知道棧頂的值,並沒有出棧)
elementtype gettop(seqstack *s)
{
if(stackempty(s))
{
printf("stack already empty.\n");
}
else return s->data[s->top];
}
int main()
{
elementtype x;
seqstack *s; //定義一個棧,用指針的方式定義的
initstack(s); //想初始化定義好的棧
//當棧為空時調用出棧操作
pop(s);

//向棧中添加一個元素a
push(s,'a');

//觀察此時的棧頂元素
x=gettop(s);
printf("%c\n",x);

//再添加一個元素b
push(s,'b');

//觀察此時的棧頂元素
x=gettop(s);
printf("%c\n",x);

//彈出棧頂的元素
x=pop(s);
printf("%c\n",x);

//觀察彈出後棧頂元素的變化情況
x=gettop(s);
printf("%c\n",x);
return 0;
}

❷ c璇璦鍫嗘爤鏄浠涔堟剰鎬濓紵

1銆佸爢鏍堢┖闂村垎閰

鏍堬紙鎿嶄綔緋葷粺錛夛細鐢辨搷浣滅郴緇熻嚜鍔ㄥ垎閰嶉噴鏀 錛屽瓨鏀懼嚱鏁扮殑鍙傛暟鍊礆紝灞閮ㄥ彉閲忕殑鍊肩瓑銆傚叾鎿嶄綔鏂瑰紡綾諱技浜庢暟鎹緇撴瀯涓鐨勬爤銆

鍫嗭紙鎿嶄綔緋葷粺錛夛細 涓鑸鐢辯▼搴忓憳鍒嗛厤閲婃斁錛 鑻ョ▼搴忓憳涓嶉噴鏀撅紝紼嬪簭緇撴潫鏃跺彲鑳界敱OS鍥炴敹錛屽垎閰嶆柟寮忓掓槸綾諱技浜庨摼琛ㄣ

2銆佸爢鏍堢紦瀛樻柟寮

鏍堜嬌鐢ㄧ殑鏄涓綰х紦瀛橈紝 浠栦滑閫氬父閮芥槸琚璋冪敤鏃跺勪簬瀛樺偍絀洪棿涓錛岃皟鐢ㄥ畬姣曠珛鍗抽噴鏀俱

鍫嗗垯鏄瀛樻斁鍦ㄤ簩綰х紦瀛樹腑錛岀敓鍛藉懆鏈熺敱鉶氭嫙鏈虹殑鍨冨溇鍥炴敹綆楁硶鏉ュ喅瀹氾紙騫朵笉鏄涓鏃︽垚涓哄ゅ効瀵硅薄灝辮兘琚鍥炴敹錛夈傛墍浠ヨ皟鐢ㄨ繖浜涘硅薄鐨勯熷害瑕佺浉瀵規潵寰椾綆涓浜涖

3銆佹晥鐜囨瘮杈

鏍堢敱緋葷粺鑷鍔ㄥ垎閰嶏紝閫熷害杈冨揩銆備絾紼嬪簭鍛樻槸鏃犳硶鎺у埗鐨勩

鍫嗘槸鐢眓ew鍒嗛厤鐨勫唴瀛橈紝涓鑸閫熷害姣旇緝鎱錛岃屼笖瀹規槗浜х敓鍐呭瓨紕庣墖,涓嶈繃鐢ㄨ搗鏉ユ渶鏂逛究銆

4銆佸瓨鍌ㄥ唴瀹

鏍堬細 鍦ㄥ嚱鏁拌皟鐢ㄦ椂錛屽湪澶у氭暟鐨凜緙栬瘧鍣ㄤ腑錛屽弬鏁版槸鐢卞彸寰宸﹀叆鏍堢殑錛岀劧鍚庢槸鍑芥暟涓鐨勫矓閮ㄥ彉閲忋傛敞鎰忛潤鎬佸彉閲忔槸涓嶅叆鏍堢殑銆

褰撴湰嬈″嚱鏁拌皟鐢ㄧ粨鏉熷悗錛屽矓閮ㄥ彉閲忓厛鍑烘爤錛岀劧鍚庢槸鍙傛暟錛屾渶鍚庢爤欏舵寚閽堟寚鍚戝嚱鏁扮殑榪斿洖鍦板潃錛屼篃灝辨槸涓誨嚱鏁頒腑鐨勪笅涓鏉℃寚浠ょ殑鍦板潃錛岀▼搴忕敱璇ョ偣緇х畫榪愯屻

鍫嗭細涓鑸鏄鍦ㄥ爢鐨勫ご閮ㄧ敤涓涓瀛楄妭瀛樻斁鍫嗙殑澶у皬銆傚爢涓鐨勫叿浣撳唴瀹圭敱紼嬪簭鍛樺畨鎺掋

鎵╁睍璧勬枡錛

綆浠

鍗曠墖鏈哄簲鐢ㄤ腑錛屽爢鏍堟槸涓鐗規畩瀛樺偍鍖猴紝鍫嗘爤灞炰簬RAM絀洪棿鐨勪竴閮ㄥ垎錛屽爢鏍堢敤浜庡嚱鏁拌皟鐢ㄣ佷腑鏂鍒囨崲鏃朵繚瀛樺拰鎮㈠嶇幇鍦烘暟鎹銆

鍫嗘爤涓鐨勭墿浣撳叿鏈変竴涓鐗規э細絎涓涓鏀懼叆鍫嗘爤涓鐨勭墿浣撴繪槸琚鏈鍚庢嬁鍑烘潵錛 榪欎釜鐗規ч氬父縐頒負鍏堣繘鍚庡嚭 (FILO鈥擣irst-In/Last-Out)銆 鍫嗘爤涓瀹氫箟浜嗕竴浜涙搷浣滐紝 涓や釜鏈閲嶈佺殑鏄疨USH鍜孭OP銆 PUSH錛堝叆鏍堬級鎿嶄綔錛氬爢鏍堟寚閽堬紙SP錛夊姞1錛岀劧鍚庡湪鍫嗘爤鐨勯《閮ㄥ姞鍏ヤ竴 涓鍏冪礌銆

POP錛堝嚭鏍堬級鎿嶄綔鐩稿弽錛屽嚭鏍堝垯鍏堝皢SP鎵鎸囩ず鐨勫唴閮╮am鍗曞厓涓鍐呭歸佸叆鐩存帴鍦板潃瀵誨潃鐨勫崟鍏冧腑錛堢洰鐨勪綅緗錛夛紝鐒跺悗鍐嶅皢鍫嗘爤鎸囬拡錛圫P錛夊噺1.銆傝繖涓ょ嶆搷浣滃疄鐜頒簡鏁版嵁欏圭殑鎻掑叆鍜屽垹闄ゃ

鍙傝冭祫鏂欐潵婧愶細鐧懼害鐧劇-鍫嗘爤

❸ C語言中的棧和堆是什麼

1、計算機中的內存分為兩部分:一部分是棧(stack,也稱堆棧),另一部分是堆(heap)。

2、 棧,可以看作是一摞卡片,最上面的卡片表示程序的當前作用域,這往往就是當前正在執行的函數。

3、堆,一段完全獨立於當前函數或者棧幀的內存區。如果一個函數中聲明了一些變數,而且希望當這個函數完成時其中聲明的變數仍然存在,就可以將這些變數置於堆中。

❹ C語言中函數參數壓棧方式為什麼是從右到左

棧是先入後出的數據結構.
函數參數從右到左, 那麼到函數內部出棧的時候就是從左到右的順序了.
對於普通函數無區別. 但對於可變參函數, 會根據左側參數來決定共計有多少參數, 每個類型是什麼.
比如 printf scanf這類的.
於是 就設計成從右到左的壓棧方式了.

❺ c語言每個函數都有一個棧區對嗎,函數的入口地址與棧區地址是一回事嗎

這個內存用來保存局部變數的, 一般叫做棧區,在編譯原理 上叫做棧幀。比如下面的代碼
int main()
{
int a = 2; //這個變數a就在main函數的內存中,就是main函數的棧區中。。
return 0;
}

而且棧區是棧區,是一個數據存儲區,並不是main函數的代碼區域 。。剛回答了這個問題。

❻ C語言 入棧順序為什麼函數入棧順序從右往左

C語言函數參數入棧順序從右到左是為了方便可變參數函數。
一、在函數調用時,函數參數的傳遞,在C語言中是通過棧數據結構實現的。
在調用函數時,先根據調用函數使用的參數,自右向左依次壓入棧中,然後調用函數,在函數開始執行時,將參數再依次彈棧。根據棧數據結構先進後出的特點,在函數中彈棧的順序就是從左向右的。
二、對於參數固定的函數,無論是從左向右還是從右向左,都沒什麼區別,最終都是所有參數全部傳遞。
三、對於可變參數,比如printf,會在第一個參數格式字元串中,指明後續有幾個參數,各自是什麼類型的。於是在函數中,參數格式字元串必須第一個彈棧,否則無法獲取參數類型,也就無法獲知後續參數占幾個位元組,導致無法正確獲知參數。
四、理論上來說,如果從左向右壓棧,可變參數標記格式字元串的參數放在最後,那麼也是可以的。 不過最早設計C語言的人採用了這種方式,後續也就延續下來了。

❼ c語言銷毀棧的函數。大家看看寫的對不

這兩個函數一個是銷毀棧DestroyStack,一個是清空棧ClearStack
銷毀是把整個棧都釋放掉,清空只是把棧里元素清除。
因為你的棧元素是int型基本變數,所以棧元素內容是直接存放在棧空間的,並沒有另外申請內存保存棧元素,所以在從棧里移除棧元素時,不需要調用free函數。
實際上你的DestroyStack可以很直接的如下:
int DestroyStack(stack &s)
{
free(s.base); //釋放棧空間,這里假設s.base是個指針而不是數組
//如果s結構也是動態申請的,也需要執行free(s);
}
至於ClearStack,書上寫的是沒問題的,清空棧,不是要釋放棧空間,而是把棧里的元素都清除,最直接的做法就是把棧頂指針指向棧底指針,棧頂和棧底指針相同時,就表示棧內無元素,棧空間還是保留,下次可以繼續把棧元素壓棧和彈棧。

❽ C語言中用stack pop() top 等與棧有關的函數需要什麼頭文件啊

1、C語言標准庫當中沒有與stack棧相關的標准類。

2、可以自定義這個頭文件,例如:

structStack
{
intmData[100];
intmLen;
};
//初始化棧
voidInitStack(Stack&S)
{
S.mLen=0;
}
//元素進棧
voidPush(Stack&S,intitem)
{
S.mData[S.mLen++]=item;
}
//刪除棧頂元素
intPop(Stack&S)
{
S.mLen--;
returnS.mData[S.mLen];
}
//返回棧頂元素
intPeek(Stack&S)
{
returnS.mData[S.mLen-1];
}
//判斷棧是否為空
boolEmptyStack(Stack&S)
{
if(S.mLen==0)returntrue;
returnfalse;
}
//清空棧
voidClear(Stack&S)
{
for(inti=0;i<S.mLen;++i)
{
Pop(S);
}
}
熱點內容
java上傳文件到伺服器 發布:2024-11-25 20:52:47 瀏覽:740
軸加工編程 發布:2024-11-25 20:52:12 瀏覽:411
手機的媒體存儲 發布:2024-11-25 20:29:42 瀏覽:264
安卓如何關閉手機桌面 發布:2024-11-25 20:24:37 瀏覽:700
腳本也違法嗎 發布:2024-11-25 20:24:24 瀏覽:304
phpeol 發布:2024-11-25 20:16:01 瀏覽:92
您所訪問的頁面升級 發布:2024-11-25 20:00:56 瀏覽:597
快手編程師 發布:2024-11-25 20:00:55 瀏覽:148
androidadt下載最新 發布:2024-11-25 19:47:29 瀏覽:353
我的世界如何強制獲得伺服器管理員許可權 發布:2024-11-25 19:39:13 瀏覽:604