C语言-顺序栈的基本操作
一、我们先明确一下什么是栈?
栈(Stack):只允许在一端进行插入或删除操作的线性表
栈顶(Top):允许操作的一端
栈底(Bottom):固定的,不允许操作的一端
同时,栈具有后进先出的特点
二、栈的存储结构是怎样的呢?
栈的顺序存储结构如下:
我们开辟了11个连续的int型内存空间,10个存储数据,1个存储栈顶指针
#define MaxSize 10
typedef struct{
int data[MaxSize]; //开辟整片连续空间
int top; //栈顶指针,其值为数组的下标
}SqStack;
三、顺序栈的各种操作:
1.初始化栈,把栈顶指针设置为-1,不指向任何数组元素。
/*
顺序栈的基本操作
*/
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10 //栈的最大容量
typedef struct{
int data[MaxSize];
int top; //栈顶指针,指向数组的下标
}SqStack;
//初始化空栈
void InitStack(SqStack *S){
S->top = -1; //初始化顺序栈的栈顶
}
2、判空,如果栈顶指针为-1,那么栈没有任何元素
//判断栈是否为空
int StackEmpty(SqStack S) {
if(S.top == -1)
return 1;
else
return 0;
}
3、进栈操作,栈不满时,栈顶指针先加1,再赋值
//新元素入栈
int Push(SqStack *S,int x){
if(S->top==MaxSize - 1){
printf("栈满,插入元素失败");
return 0;
}
S->top += 1; //栈未满时,栈顶指针先加1
S->data[S->top] = x; //再把值送到栈顶元素
return 1;
}
4、出栈操作,栈非空时,先取值,再把栈顶指针减1
//栈顶元素出栈
int Pop(SqStack *S){
int top_number=0;
if(S->top == -1){
printf("栈空,取出元素失败");
return 0;
}
top_number = S->data[S->top]; //栈非空时,先取出栈顶元素
S->top --; //再把栈顶指针减1,此时数据还残留在内存中,知识逻辑上删除了
return top_number; //返回栈顶元素
}
5、销毁栈,分为物理销毁或逻辑销毁
物理销毁会释放内存空间
逻辑销毁则让指针初始化,存储数据的空间依旧残留旧数据
//销毁栈
void DestroyStack(SqStack *S){
free(S); //物理上销毁,销毁内存空间
//S->top = -1; 逻辑上销毁,让指针回到初始位置,内存空间上残留之前的数据
}
6、测试代码
void main(){
SqStack S; //声明,内存中开辟空间
InitStack(&S); //初始化,栈顶指针设置为-1
Push(&S,5); //栈未满时,入栈,栈顶指针先加1再赋值
printf("出栈元素是%d",Pop(&S)); //栈非空时,出栈,先取值再把栈顶指针减1
DestroyStack(&S); //销毁栈
}