C语言中用stack pop() top 等与栈有关的函数需要什么头文件?。浚浚?/h2>1、C语言标准库当中没有与stack栈相关的标准类 。
2、可以自定义这个头文件,例如:
struct Stack
{
int mData[100];
int mLen;
};
//初始化栈
void InitStack(Stack S)
{
S.mLen = 0;
}
//元素进栈
void Push(Stack S,int item)
{
S.mData[S.mLen] = item;
}
//删除栈顶元素
int Pop(Stack S)
{
S.mLen--;
return S.mData[S.mLen];
}
//返回栈顶元素
intPeek(Stack S)
{
return S.mData[S.mLen-1];
}
//判断栈是否为空
bool EmptyStack(Stack S)
{
if(S.mLen == 0) return true;
return false;
}
//清空栈
void Clear(Stack S)
{
for(int i = 0;iS.mLen;i)
{
Pop(S);
}
}
数据结构实验(用c语言写) 栈的基本操作//顺序栈
#includestdio.h
#includestdlib.h
#includemalloc.h
#define STACK_INIT_SIZE 100;
#define STACKINCREMENT 10;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
typedefint ElemType;
int InitStack(SqStack S) //为栈S分配存储空间,并置S为空栈
{
int size = STACK_INIT_SIZE;
S.base=(int *)malloc(size*sizeof(ElemType));
if(!S.base)
return 0;
S.top=S.base; //置栈S为空栈
S.stacksize=STACK_INIT_SIZE;
return 1;
}
intGetTop(SqStack S,int e)//若栈不空,则用e返回S的栈顶元素
{
if(S.top==S.base) return 0;
e=*(S.top-1);
return 1;
}
intPush(SqStack S, int e) /*进栈函数,将e插入栈S中,并使之成为栈顶元素*/
{if(S.top-S.base=S.stacksize) /*栈满 , 追加存储空间*/
{
int stackinvrement = STACKINCREMENT;
S.base=(ElemType *) realloc(S.base,(S.stacksize stackinvrement)*sizeof(ElemType));
if(!S.base)
return 0; /*存储分配失败*/
S.stacksize =STACKINCREMENT;
}
*S.top=e;
return 1;
}
intPop(SqStack S,int e)/*出栈函数,若栈S不空,则删除S的栈顶元素,用e返回其值*/
{ if(S.top==S.base) return 0;
e=*--S.top;
return 1;
}
void OutputStack(SqStack S)
{int *q;
q=S.top-1;
for(int i=0;iS.top-S.base;i)
{
printf("= ",*q);q--;}
}
void main()
{
int a,b,c ;
char m;
SqStack s;
InitStack(s);
printf("请输入要进栈的元素个数是:");
scanf("%d",a);
printf("\n请输入要进栈的%d个元素:",a);
for(b=0;ba;b) {
scanf("%d",c);
Push(s,c); }
do { printf("\n");
printf("*********** 1.输出栈的元素**********\n");
printf("*********** 2.取栈顶元素************\n");
printf("*********** 3.删除栈顶元素**********\n");
printf("*********** 4.退出程序**********\n");
printf("\n请选择一个字符:");
getchar();
scanf("%c",m);
switch(m) {
case '1': printf("\n输出的栈为:");
OutputStack(s);
break;
case '2': GetTop(s,c);
printf("\n栈顶元素为:%d",c);
printf("\n输出的栈为:");
OutputStack(s);
break;
【c语言堆栈的头函数 c语言堆栈头文件】case '3': Pop(s,c);
printf("\n删除的栈顶元素:%d",c);
printf("\n输出的栈为:");
OutputStack(s);
printf("\n");
break;
case '4':break;
default: printf("输入的数字有错,请重新选择!\n"); break;
}
}while(m!='4');
}
//链栈
#includestdio.h
#includestdlib.h
typedef struct SNode
{
int data;
struct SNode *next;
}SNode,*LinkStack;
LinkStack top;
LinkStack PushStack(LinkStack top,int x)//入栈
{
LinkStack s;
s=(LinkStack)malloc(sizeof(SNode));
s-data=https://www.04ip.com/post/x;
s-next=top;
top=s;
return top;
}
LinkStack PopStack(LinkStack top)//退栈
{
LinkStack p;
if(top!=NULL)
{
p=top;
top=top-next;
free(p);
printf("退栈已完成\n");
return top;
}
else printf("栈是空的 , 无法退栈!\n"); return 0;
}
int GetStackTop(LinkStack top)//取栈顶元素
{
return top-data;
}
bool IsEmpty()//bool取值false和true,是0和1的区别,bool只有一个字节,BOOL为int型,bool为布尔型
{
return top==NULL ? true:false;
}
void Print()
{
SNode *p;
p=top;
if(IsEmpty())
{
printf("The stack is empty!\n");
return;
}
while(p)
{
printf("%d ", p-data);
p=p-next;
}
printf("\n");
}
void main()
{
int x,a,b;
char m;
do {printf("\n");
printf("###############链栈的基本操作##################\n");
printf("××××××××1.置空栈××××××××××\n");
printf("××××××××2.进栈×××××××××××\n");
printf("××××××××3.退栈×××××××××××\n");
printf("××××××××4.取栈顶元素××××××××\n");
printf("××××××××5.退出程序×××××××××\n");
printf("##############################################\n");
printf("\n请选择一个字符:");
scanf("%c",m);
switch(m){
case '1':
top=NULL;
printf("\n栈已置空!");
break;
case '2':
printf("\n请输入要进栈的元素个数是:");
scanf("%d",a);
printf("\n请输入要进栈的%d个元素:",a);
for(b=0;ba;b) {
scanf("%d",x);
top=PushStack(top,x); }
printf("进栈已完成!\n");
printf("\n输出栈为:");
Print();
break;
case '3':
printf("\n操作之前的输出栈为:");
Print();
top=PopStack(top);
printf("\n操作过后的输出栈为:");
Print();
break;
case '4':
printf("\n输出栈为:");
Print();
if(top!=NULL)
printf("\n栈顶元素是:%d\n",GetStackTop(top));
else
printf("\n栈是空的,没有元素!");
break;
case '5':break;
default:
printf("\n输入的字符不对 , 请重新输入!");
break;
}
getchar();
}while(m!='5');
}
谁能帮我说下C语言中的堆栈个人认为楼上的不懂C语言堆栈到底是怎么回事,按楼上说法,只是大概讲c语言堆栈的头函数了下栈,没有讲堆.
要讲C语言的堆栈,要从计算机的数据内存分配讲起.
____________________
|Stack区(数组c语言堆栈的头函数,指针,结构体,局部变量)
____________________
|Static变量(静态变量,全局变量)
____________________
|Heep区(堆区)
____________________
|代码段
____________________
从上面示意图中可看出整个内存分配,堆分配是在内存中按块划分,也就是相对与函数malloc,realloc,calloc.这3个函数为内存分配函数.而且需要手动调用free函数释放资源,否则会造成大量的内存碎片.
如果楼主不相信可以自己写一个死循环,内部调用malloc函数,创建N个内存块,运行一段时间后,绝对会造成系统瘫痪,资源被耗尽.
栈区划分为计算机自身划分,即在函数或局部变量被调用时,系统自动为其分配栈,以后进先出为原则实现变量的保存,在函数调用完毕时,系统会自动释放栈内资源,所以,栈可以说是短命的(生存周期只在调用过程中).
这里只是粗略说了下堆和栈,另外再说下static--静态区,全局变量或静态变量存放于静态区,只要代码中存在静态变量或全局变量,自动放于静态区,静态区存放的变量生存周期是整个程序结束时才释放.
代码段区,顾名思义存放的是程序代码(暂时先这么理解).
PS:本人原创,最近发现一些人盗用本人回答的问题.特此声明.嘿嘿.
____________________ _________
补充:
c语言堆栈的头函数我对于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);
}
请用C语言编写一个堆栈函数程序//该程序简单并可正确运行 , 希望kutpbpb的回答能对你有所帮助!
#includestdio.h
#define N100
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语言的头函数有什么作用?包括了什么东西在里面?头函数在预处理里面,也就是在里面包含了很多的函数原型以及定义 。
比如stdio.h中就包含printf , scanf等等函数 。
不包含会报警告 。
c语言的堆栈是怎么回事?。?/h2>堆(heap)和栈(stack)有什么区别??
简单的可以理解为:
heap:是由malloc之类函数分配的空间所在地 。地址是由低向高增长的 。
stack:是自动分配变量,以及函数调用的时候所使用的一些空间 。地址是由高向低减少的 。
预备知识—程序的内存分配
一个由c/C编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等 。其操作方式类似于数据结构中的栈 。
2、堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵 。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域 。- 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的 。程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码 。
二、例子程序
这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456在常量区,p3在栈上 。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区 。
strcpy(p1, "123456"); 123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方 。
}
二、堆和栈的理论知识
2.1申请方式
stack:
由系统自动分配 。例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大?。赾中malloc函数
如p1 = (char *)malloc(10);
在C中用new运算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在栈中的 。
2.2
申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出 。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,
会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除 , 并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样 , 代码中的delete语句才能正确的释放本内存空间 。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中 。
2.3申请大小的限制
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域 。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M , 总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow 。因此,能从栈获得的空间较小 。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域 。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址 。堆的大小受限于计算机系统中有效的虚拟内存 。由此可见,堆获得的空间比较灵活,也比较大 。
2.4申请效率的比较:
栈由系统自动分配,速度较快 。但程序员是无法控制的 。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便 。但是速度,也最灵活
2.5堆和栈中的存储内容
栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中 , 参数是由右往左入栈的 , 然后是函数中的局部变量 。注意静态变量是不入栈的 。
当本次函数调用结束后,局部变量先出栈,然后是参数 , 最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行 。
堆:一般是在堆的头部用一个字节存放堆的大小 。堆中的具体内容有程序员安排 。
2.6存取效率的比较
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快 。
比如:
#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
对应的汇编代码
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx 1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中 , 而第二种则要先把指edx中,在根据edx读取字符 , 显然慢了 。
?
2.7小结:
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小 。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大 。
堆和栈的区别主要分:
操作系统方面的堆和栈,如上面说的那些,不多说了 。
还有就是数据结构方面的堆和栈,这些都是不同的概念 。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构 。
虽然堆栈 , 堆栈的说法是连起来叫 , 但是他们还是有很大区别的,连着叫只是由于历史的原因针值读
关于c语言堆栈的头函数和c语言堆栈头文件的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 益智游戏比较短的作文,关于益智游戏
- 画画特效软件安卓,特效绘画素材
- 美国无人机服务器排名榜,美国无人机服务器排名榜最新
- 老福特为什么没有录屏直播,老福特可以看视频吗
- mysql怎么自动增长列 mysql自动增长是什么意思
- 如何找新媒体类的工作呢,新媒体找什么工作
- 公众号群主群怎么进去,公众号群主群怎么进去群聊
- 怎么设置网络ip代理,如何设置代理ip地址
- php如何取出数据 php取数据库中某个字段的值