数据结构 顺序栈c
栈可用数组或者链表描述,这里是数组版
还有获取某个位置的值,太简单懒得打了
记住栈的结构,结构体里面一个数组,一个指针即可
递归函数工作过程:
1.调用新函数
a.将所有实参,返回地址传输给被调用的函数
b.给被调用函数的局部变量分配内存
c.控制转移到被调用函数入口
2.新函数调用完成,返回给调用函数
a.保存被调用函数刚刚的计算结果
b.释放被调用函数的储存
(值传递参数,非static定义的变量分配在栈上,随之销毁。
malloc等分配在堆上,定义的static全局变量不会销毁)
c.返回值,控制权交到1.a保存的返回地址的调用函数。
(注意返回局部变量的值是完全可以的,但是不能返回局部变量的指针,因为指针指向的值已经被销毁,会造成悬空指针
值在2.a被拷贝了,虽然本体被销毁,但是可以通过拷贝值传出去,但是返回指针的话,虽然指针的值能传,但是指向的值已经没了,形成UB)
#include<stdio.h>
#include<stdlib.h>
//定义长度 和数据类型SElemType
#define MAXSIZE 100
typedef int SElemType;
typedef struct{
SElemType data[MAXSIZE];
int top;
}Stack;
//给top赋初值
int InitStack(Stack *s){
s->top=-1;
return 1;
}
//判断栈是否为空,不为空则弹出值,返回给e。
int pop(Stack *s,SElemType *e){
if(s->top==-1){
printf("栈已空\n");
return 0;
}
*e=s->data[s->top];
s->top--;
return 1;
}
//判断栈是否满,未满则压入e。
int push(Stack *s,SElemType e){
if(s->top>=MAXSIZE-1){
printf("栈已满");
return 0;
}
s->top++;
s->data[s->top]=e;
return 1;
}
void print(Stack s){
if(s.top==-1){
printf("栈为空!");
return ;
}
for(int i=0;i<=s.top;i++){
printf("%d ",s.data[i]);
}
printf("\n");
return ;
}
int main(){
Stack s;
InitStack(&s);
push(&s,1);
push(&s,2);
print(s);
}

浙公网安备 33010602011771号