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