谁能帮我说下C语言中的堆栈

谁能帮我说下C语言中的堆栈,第1张

个人认为楼上的不懂C语言堆栈到底是怎么回事,按楼上说法,只是大概讲了下栈,没有讲堆

要讲C语言的堆栈,要从计算机的数据内存分配讲起

____________________

| Stack区(数组,指针,结构体,局部变量)

____________________

| Static变量(静态变量,全局变量)

____________________

| Heep区(堆区)

____________________

| 代码段

____________________

从上面示意图中可看出整个内存分配,堆分配是在内存中按块划分,也就是相对与函数malloc,realloc,calloc这3个函数为内存分配函数而且需要手动调用free函数释放资源,否则会造成大量的内存碎片

如果楼主不相信可以自己写一个死循环,内部调用malloc函数,创建N个内存块,运行一段时间后,绝对会造成系统瘫痪,资源被耗尽

栈区划分为计算机自身划分,即在函数或局部变量被调用时,系统自动为其分配栈,以后进先出为原则实现变量的保存,在函数调用完毕时,系统会自动释放栈内资源,所以,栈可以说是短命的(生存周期只在调用过程中)

这里只是粗略说了下堆和栈,另外再说下static-->静态区,全局变量或静态变量存放于静态区,只要代码中存在静态变量或全局变量,自动放于静态区,静态区存放的变量生存周期是整个程序结束时才释放

代码段区,顾名思义存放的是程序代码(暂时先这么理解)

PS:本人原创,最近发现一些人盗用本人回答的问题特此声明嘿嘿

____________________ _________

补充:

我对于C#不是很熟悉,而且我也是从事C开发的,对于面向对象语言应用不是很熟在这只能给出C++的代码代码有点长,不知道你能不能看的懂,才写的

#include <iostreamh>

#include <stdlibh>

#include <malloch>

#include <stringh>

#include <timeh>

#include <stdioh>

#include <asserth>

/

//基于数组的栈的实现

#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:";

cin>>e;

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:";

cin>>n;

for(int i=0; i<n; i++)

{

Push(&S);

}

cout<<"How many times do you want to Pop:";

cin>>n;

for(i=0; i<n; 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)->element<<endl;

(pst) = NULL;

free(S);

return (pst);

}

else

{

cout<<"Out:"<<(pst)->element<<endl;

(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:";

cin>>n;

for(int i=0; i<n; i++)

{

Push(&pS);

}

pStack S;

S = Pop(&pS);

}

#include <stdioh>//N皇后问题

#include <

stdlibh

>

#include <stdioh>

#include <

iostreamh

>

#include <

timeh

>

#include <dosh>

#include<malloch>

typedef struct {

int elem;

int length;

int listsize;

}Sqlist;

int InitList(Sqlist & L){//初始化

Lelem=(int )malloc(100sizeof(int));

if(!Lelem)

return 0;

Llength=0;

Llistsize=100;

return 1;

}

int Insert(Sqlist & L,int e){//插入

int m=0,i=0; 

int p=&Lelem[0],j=&Lelem[0];

if(Llength==0)

{ p=e; Llength++;return 1;}

for(i;i<Llength;i++)

if(e>=(p+i))

m=i+1;

for(i=Llength;i>m;i--)

(j+i)=(j+i-1);

Lelem[m]=e;

Llength++;

return 1;

}

void Print(Sqlist &L,int n){//

遍历

打印输出

int k=1,i=0; intp=&Lelem[0];

for(i=0;i<nn;i++,k++){

printf("%d ",(p+i));

if(k==n){k=0;printf("\n");}}

printf("\n\n\n\n\n\n\n");

}

int ReturnK(Sqlist &L,int k){//返回第K个元素的值

intp=&Lelem[0];

return (p+k-1); 

}

void FuK(Sqlist &L,int k,int e){//将第k个元素赋值为e

int p=&Lelem[0];

(p+k-1)=e;

}

int TiaoJian(Sqlist L,int n,int &e){//是否满足皇后问题判断

int b[100];

int m=0,h=2n;

for(int k=0;k<2n;k++) b[k]=0; 

for(int i=1;i<=nn;i++)

if(ReturnK(L,i)==1)

{b[m]=(i-1)/n+1;m++;b[m]=i-(b[m-1]-1)n;m++;}

for(int c=0;c<2n;c++)

if(b[c]==0) {h=c;break;} 

for( c=0;c<h-2;c=c+2)

for(int d=c+2;d<h;d=d+2)

if(b[c]==b[d]||b[c+1]==b[d+1]||b[d+1]-b[c+1]==b[d]-b[c]||b[d+1]-b[c+1]==b[c]-b[d])

return 0;

if(h==2n){

printf("\n\n%d皇后问题第%d个排列!\n\n",n,e);e++;

}

return 1; 

}

void Trial(Sqlist &L,int i,int n,int &e){//皇后问题

int j;

if(i>n){Print(L,n);}

else for(j=1;j<=n;j++){

FuK(L,ni-n+j,1);

if(TiaoJian(L,n,e)==1)

Trial(L,i+1,n,e);

FuK(L,ni-n+j,0);

}

}

void main(){

int k,i=0; 

printf("\n\n请输入要n皇后问题个数:\n");

scanf("%d",&k);

time_t rawtime;

struct tm

 timeinfo;

time ( &rawtime );

timeinfo = localtime ( &rawtime );

Sqlist L1;

InitList(L1); 

for(i=0;i<kk;i++)

Insert(L1,0);

int e=1;

Trial(L1,1,k,e);

printf ( "The current date/time is: %s", asctime (timeinfo) );

time ( &rawtime );

timeinfo = localtime ( &rawtime );

printf ( "The current date/time is: %s", asctime (timeinfo) );

printf("哈哈哈哈\(^o^)/~\n");

system("pause");

}

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除 *** 作,而在表的后端(rear)进行插入 *** 作,和栈一样,队列是一种 *** 作受限制的线性表。进行插入 *** 作的端称为队尾,进行删除 *** 作的端称为队头。

以上是从数据结构角度来看,从 *** 作系统角度来看,所有的数据结构都是对虚拟内存的 *** 作,堆是堆,栈是栈,栈指的是C语言函数所使用的自动有函数回收的虚拟内存空间,而堆则有 *** 作系统堆管理器来管理的那部分虚拟内存,从C语言角度来看,使用malloc函数动态分配的内存,就是堆内存。

堆是用来申请不连续内存的数据区域,比如链表,地址不连续,而是通过指针串在一起形成一个连续的结构,c语言中用malloc函数申请的内存都在堆上,申请过不用时记得要用free函数释放掉,不然内存泄露。

而栈的速度比堆的快,数组和局部变量都是在栈上分配,效率比较高。

另外还有自由存储区、全局/静态存储区和常量存储区,此处不一一讲解了。

在启动文件里都要设置堆和栈的大小,这样合理的分配才不会造成资源的浪费。假如你代码中使用的链表占用空间比较大,这时你就需要把堆设置大一点。假如你使用的数组比较大,就得把堆设置大一点。最简单的方法可以测试一下栈大小,定义一个很大的数组int a[m]; m足够大时就会栈溢出。

想更多的了解c语言具体内存分区的话去百度吧,就帮你到这里了

以下代码是基于C语言写的堆栈的压栈,出栈,清栈,读栈指针等方法,在Visual studio 中,可直接使用,供学习者参考学习。

#include

#include

#include

#include

#include

#include

#define MAX_SIZE 100

typedef struct Stack

{

char data;

int size;

int top;

};

void initStack(Stack s); //init stack

void destroyStack(Stack s);

bool push(Stack s,char ch);

char pop(Stack s);

char gettop(Stack s);

bool isEmpty(Stack s);

bool isFull(Stack s);

void setNull(Stack s);

#endif

void initStack(Stack s)

{

s->data = (char)malloc(MAX_SIZE sizeof(char)); //分配最大内存空间

if (!s->data)

exit(OVERFLOW); //提前终止程序

s->size = MAX_SIZE;

s->top = -1;

}

void destroyStack(Stack s)

{

free(s->data);

}

bool push(Stack s, char ch)

{

if ((s->top + 1) != s->size)

{

s->data[++s->top] = ch;

return true;

}

else

return false;

}

char pop(Stack s)

{

if (s->top != -1)

return s->data[s->top--];

}

char gettop(Stack s)

{

return s->data[s->top];

}

bool isEmpty(Stack s)

{

if (s->top == -1)

return true;

else

return false;

}

bool isFull(Stack s)

{

if ((s->top + 1) == s->size)

return true;

else

return false;

}

void setNull(Stack s)

{

s->top = -1;

}

int main()

{

char chd;

bool c;

Stack s1;

initStack(&s1);

c = push(&s1, 'a');

printf("Stack s1 push status is %d,sdata is %c,top value is %d ", c,s1data[s1top],s1top);

c = push(&s1, 'b');

printf("Stack s1 push status is %d,sdata is %c,top value is %d ", c, s1data[s1top], s1top);

chd = gettop(&s1);

printf("Stack s1->top data:%c,top value is %d ", chd, s1top);

chd = pop(&s1);

printf("Stack d出 data:%c,top value is %d ", chd, s1top);

chd = pop(&s1);

printf("Stack d出 data:%c,top value is %d ", chd, s1top);

c = isEmpty(&s1);

printf("Stack s1 c bool:%d,top value is %d ", c, s1top);

c = isFull(&s1);

printf("Stack s1 c bool:%d,top value is %d ", c, s1top);

return 0;

}

以上就是关于谁能帮我说下C语言中的堆栈全部的内容,包括:谁能帮我说下C语言中的堆栈、利用《数据结构》课程知识完成C语言程序设计“N皇后问题”(堆栈,一维数组,普通算法都可以,用C语言写、c语言堆栈和队列等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9761285.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存