重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
个人认为楼上的不懂C语言堆栈到底是怎么回事,按楼上说法,只是大概讲了下栈,没有讲堆.
创新互联公司2013年成立,是专业互联网技术服务公司,拥有项目网站建设、成都网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元合江做网站,已为上家服务,为合江各地企业和个人服务,联系电话:13518219792
要讲C语言的堆栈,要从计算机的数据内存分配讲起.
____________________
| Stack区(数组,指针,结构体,局部变量)
____________________
| Static变量(静态变量,全局变量)
____________________
| Heep区(堆区)
____________________
| 代码段
____________________
从上面示意图中可看出整个内存分配,堆分配是在内存中按块划分,也就是相对与函数malloc,realloc,calloc.这3个函数为内存分配函数.而且需要手动调用free函数释放资源,否则会造成大量的内存碎片.
如果楼主不相信可以自己写一个死循环,内部调用malloc函数,创建N个内存块,运行一段时间后,绝对会造成系统瘫痪,资源被耗尽.
栈区划分为计算机自身划分,即在函数或局部变量被调用时,系统自动为其分配栈,以后进先出为原则实现变量的保存,在函数调用完毕时,系统会自动释放栈内资源,所以,栈可以说是短命的(生存周期只在调用过程中).
这里只是粗略说了下堆和栈,另外再说下static--静态区,全局变量或静态变量存放于静态区,只要代码中存在静态变量或全局变量,自动放于静态区,静态区存放的变量生存周期是整个程序结束时才释放.
代码段区,顾名思义存放的是程序代码(暂时先这么理解).
PS:本人原创,最近发现一些人盗用本人回答的问题.特此声明.嘿嘿.
____________________ _________
补充:
我对于C#不是很熟悉,而且我也是从事C开发的,对于面向对象语言应用不是很熟.在这只能给出C++的代码.代码有点长,不知道你能不能看的懂,才写的.
#include iostream.h
#include stdlib.h
#include malloc.h
#include string.h
#include time.h
#include stdio.h
#include assert.h
/*
//基于数组的栈的实现
#define N 50
typedef struct Stack{
int top;
int A[N];
}*pStack;
//Pop出栈
int Pop(pStack pst)
{
int e;
if(pst-top == -1)
{
cout"Stack is empty!"endl;
return -1;
}
else
{
e = pst-A[pst-top];
pst-top--;
// cout"The element "e" is pop"endl;
return e;
}
}
//Push入栈
void Push(pStack pst)
{
int e;
if(pst-top == N-1)
{
cout"Stack is full!"endl;
}
else
{
cout"Input the push number:";
cine;
pst-top++;
pst-A[pst-top] = e;
}
}
//清空栈
void empty(pStack pst)
{
pst-top = -1;
}
//判断栈是否为空
int IsEmpty(pStack pst)
{
if(pst-top == -1)
{
return 0;
// cout"The Stack is empty!"endl;
}
else
{
return 1;
// cout"The Stack is not empty!"endl;
}
}
//判断栈是否为满
int IsFull(pStack pst)
{
if(pst-top == N-1)
{
return 0;
}
else
{
return 1;
}
}
//初始化栈
void InitStack(pStack pst)
{
pst-top = -1;
}
void main()
{
Stack S;
InitStack(S);
int n;
cout"How many times do you want to Push:";
cinn;
for(int i=0; in; i++)
{
Push(S);
}
cout"How many times do you want to Pop:";
cinn;
for(i=0; in; i++)
{
cout"The element "Pop(S)" is pop"endl;
}
cout"The Stack's stutor:"endl;
if(IsEmpty(S) == 0)
{
cout"The Stack is empty!"endl;
}
else
{
cout"The Stack is not empty!"endl;
}
if(IsFull(S) == 0)
{
cout"The Stack is full!"endl;
}
else
{
cout"The Stack is not full!"endl;
}
empty(S);
cout"The Stack's stutor:"endl;
if(IsEmpty(S) == 0)
{
cout"The Stack is empty!"endl;
}
else
{
cout"The Stack is not empty!"endl;
}
}
*/
typedef struct Stack{
Stack *prior;
Stack *next;
int element;
}*pStack;
//压栈
void Push(pStack *pst)
{
if((*pst) == NULL)
{
pStack S = (pStack)malloc(sizeof(Stack));
(*pst) = S;
(*pst)-next = NULL;
(*pst)-prior = NULL;
cout"Input the PUSH data:";
cin(*pst)-element;
}
else
{
pStack S = (pStack)malloc(sizeof(Stack));
(*pst)-next = S;
S-prior = (*pst);
S-next = NULL;
(*pst) = S;
cout"Input the PUSH data:";
cin(*pst)-element;
}
}
//判断是否为空
int IsEmpty(pStack pst)
{
if(pst == NULL)
{
cout"The Stack is empty!"endl;
return 1;
}
return 0;
}
//出栈
pStack Pop(pStack *pst)
{
if(IsEmpty((*pst)) == 1)
return (*pst);
pStack S = (*pst);
if((*pst)-prior == NULL)
{
cout"Out:"(*pst)-elementendl;
(*pst) = NULL;
free(S);
return (*pst);
}
else
{
cout"Out:"(*pst)-elementendl;
(*pst) = (*pst)-prior;
(*pst)-next = NULL;
free(S);
return (*pst);
}
}
//初始化栈
void InitStack(pStack pst)
{
pst = NULL;
}
void main()
{
pStack pS = NULL;
// InitStack(pS);
int n;
cout"How many times do you want to Push:";
cinn;
for(int i=0; in; i++)
{
Push(pS);
}
pStack S;
S = Pop(pS);
}
//该程序简单并可正确运行,希望kutpbpb的回答能对你有所帮助!
#includestdio.h
#define N 100
typedef struct
{
int value[N];
int base;
int top;
}Sta;
void print()
{
printf("\n菜单:");
printf("\n1.入栈:");
printf("\n2.出栈:");
printf("\n3.退出:");
}
void printS(Sta S)
{
printf("\n请输出栈中元素:");
for(int i=S.top;i!=S.base;i--)
printf("%d ",S.value[i-1]);
}
void pushS(Sta S,int e)
{
if(S.top==N)
printf("\n栈满");
else
S.value[S.top++]=e;
}
void popS(Sta S,int e)
{
if(S.top==S.base)
printf("\n栈空");
else
{
e=S.value[--S.top];
printf("\n请输出出栈元素: %d",e);
}
}
void main()
{
Sta S;
int e,choose;
S.base=S.top=0;
do{
print();
printf("\n请输入你的选项:");
scanf("%d",choose);
switch(choose)
{
case 1:
printf("\n请输入入栈元素:");
scanf("%d",e);
pushS(S,e);
printS(S);
break;
case 2:
popS(S,e);
printS(S);
break;
case 3:
default:
break ;
}
if(choose==3)
break;
}while(1);
}
C语言中的堆和栈都是一种数据项按序排列的数据结构。
栈就像装数据的桶或箱子
我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。
这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。
堆像一棵倒过来的树
而堆就不同了,堆是一种经过排序的树形数据结构,每个结点都有一个值。
通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。
由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书。
虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。
扩展资料:
关于堆和栈区别的比喻
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
参考资料来源:百度百科-堆栈