1、栈的相关概念
栈:限定仅在表尾进行插入或删除操作的线性表
栈是后进先出:后来的反而需要先服务
栈分为顺序栈和链式栈(本节为不定长的顺序表,能自动扩容)
栈只能在一端进行插入和删除,插入和删除的这一端称为栈顶,另一端称为栈底
2、基本操作
首先进行定义结构体
typedef struct Stack{
int* base;//指向动态内存
int top;//栈顶指针,也是下标(存放数据的下标)
int stacksize;//栈的总大小
}Stack,*PStack;
//初始化
#define INIT_SIZE 20
void InitStack(PStack ps){
assert(ps!=NULL);
if(ps==NULL){
return;
}
//开辟内存
ps->base=(int*)malloc(INIT_SIZE*sizeof(int));
assert(ps->base!=NULL);
//初始化就要让结构体内所有元素进行初始化
ps->top=0;
ps->stacksize=INIT_SIZE;
}
//往栈中入数据(入栈)
static void Inc(PStack ps){
//进行扩容
ps->stacksize*=2;
//将扩容后的开辟新的动态内存
//不能写做ps->base=...realloc...编译器不通过
int *p=(int*)realloc(ps->base,ps->stacksize*sizeof(int));
if(p==NULL){
IsFull(ps);
}
else{
ps->base=p;
}
assert(ps->base!=NULL);
}
static bool IsFull(PStack ps){
return ps->top==ps->stacksize;//判满条件
}
bool Push(PStack ps,int val){
assert(ps!=NULL);
if(ps==NULL){
return false;
}
if(IsFull(ps)){
Inc(ps);
}
//表尾(栈顶)处插入,即入栈
ps->base[ps->top]=val;
return true;
}
//获取栈顶元素的值,但是不删除
bool GetTop(PStack ps,int *rtval){//*rtval为输出参数
assert(ps!=NULL);
if(ps==NULL){
return false;
}
if(IsEmpty(ps)){
return false;
}
*rtval=ps->base[ps->top-1];
return true;
}
//获取栈顶元素的值,并且删除
bool Pop(PStack ps,int *rtval){
assert(ps != NULL);
if (ps == NULL) {
return false;
}
if (IsEmpty(ps)) {
return false;
}
*rtval=ps->base[--ps->top];
return true;
}
//获取栈中有效元素个数
int GetLength(PStack ps){
assert(ps!=NULL);
if(ps==NULL){
return 0;
}
return ps->top;//有效数据的个数
}
//清空所有数据
void Clear(PStack ps){
assert(ps!=NULL);
if(ps==NULL){
return;
}
ps->top=0;
}
//销毁
void Destroy(PStack ps){
assert(ps!=NULL);
if(ps==NULL){
return;
}
free(ps->base);
ps->base=NULL;
ps->top=0;
ps->stacksize=0;
}