栈又名堆栈,隶属于线性表,类似于显示生活中的仓库一类用来存储的,在我们电脑上面就是用来存储数据的,栈的特点是先进后出,后进先出,也就是后来者居上。
栈分为栈顶和栈底,底部数据一般情况下是不变的,顶部负责数据插入删除等等...
栈的插入删除是从栈顶开始,因为栈底元素不允许被直接删除或插入
栈的结构体(下图所示)
typedef struct Stack{
int data[MAX]; //数据域
int size; //栈的大小(栈中元素的个数)
}Stack,*SeqStack;
看到这个图相信大家也都看出来了,栈的结构体和链表的结构体有很多相似之处,只不过栈里存数据的是个数组,没指针域,只有一个栈的长度。
2.栈的初始化
SeqStack create(){
//创建栈,相当于动态开辟一个数组出来
SeqStack p=(Stack *)malloc(sizeof(Stack));
if(p==NULL){
return NULL;
}
//初始化栈的大小
p->size=0;
//初始化栈中的元素
for(int i=0;i<MAX;i++){
p->data[i]=0;l
}
return p;
}
我们首先就在函数中动态创建一个栈类型的p,在if中判断他是否为空,如果为空那就是创建失败
不为空则继续运行
我们把p的长度定为了0,因为我们刚创建出来,里面还是什么都没有的状态。
然后用for循环先把所有的空间值设置为零。
3.入栈
void push(SeqStack stack,int data){
if(stack==NULL){
return;
}
//入栈需要判断栈是否已满
if(stack->size==MAX){
printf("栈已满!\n");
return;
}
//stack->size 栈的大小就是我们插入元素的下,一个位置
stack->data[stack->size]=data;
stack->size++;
}//入栈需要注意栈是否为空, 栈是否已满
入栈顾名思义就是进入栈,在函数中,我们首先判断这个栈是不是空,是不是已经满了,如果满足这两个条件其中任意一个,就直接结束掉.
最后那部分操作类似于我们链表的头插法。
4.出栈
void pop(SeqStack stack){
if(stack==NULL){
return;
}
if(stack->size==0){
printf("栈已空!\n");
return;
}
//删除一个元素
stack->data[stack->size-1]==0;
//改变栈的大小
stack->size--;
}
出栈我们要先判断栈是否为空,如果为空则结束,下面操作是个删除操作,最后的那一步是为了改变
改变栈区的大小。
当我们5.遍历栈区
5.
void foreachStack(SeqStack stack){
if(stack==NULL){
return;
}
for(int i=0;i<stack->size;i++){
printf("%d ",stack->data[i]);
}
}
这就到了我们遍历输出的一步了,还是判断是否为空,然后for循环正常使用,printfntf输出我们结构体数组也就是栈区中的元素
。