0.定义一个栈的结构体
栈包含一个头指针top和底指针base
top指向栈头,出入栈全靠他
base指向栈底。
代码:
typedef char ElemType;
typedef struct_st_stack
{
ElemType *base; / /ElemType 控制栈里存的内容是什么类型
ElemType *top;
int stack_size;
}Zhan;
1.创建一个栈
代码:
void initZhan(Zhan * p)//
{p->base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(int)); //开天辟地,给栈底指针一席之地
p->top=Z->base; //开始栈顶指针指向栈底
p->stackSize=STACK_INIT_SIZE; //栈的大小
}
2.入栈操作
Ⅰ.是否需要扩容
定义好的栈是有存储上限的,如果存入栈的数超过上限就需要进行扩容
Ⅱ.存入值
代码:
#define STACKINCREAMENT 10 //每次扩容的增加量为10
void Push(Zhan *p,ElemType e)
{
int m=(p->top)-(p->base);
if(m==p->stackSize) //栈满了!
{
p->base=(ElemType*)realloc(p->base,(p->stackSize+STACKINCREAMENT)*sizeof(ElemType)); //realloc给base重新申请了(原大小+△x)的存储空间,并把原 //来内容复制到这个空间里
}
*(p->top)=e; //把e赋给栈顶指针的值
p->top++; //往上走一个,准备迎接下一个数
}
3.出栈操作
将栈顶元素出栈
代码:
void Pop(Zhan *p,ElemType *e)
{
if(p->top == p->base) //已经出空了
{
return;
}
*e = *--(p->top); //因为Pop前肯定有Push操作
//所以栈顶指针本来指向栈顶元素的上一个
//所以回退再复制给e
}
4.销毁一个栈
void DestoryZhan(Zhan *p)
{
free(p->base)
p->base=NULL; //防止野指针
p->top=NULL; //防止野指针
}
5.清空一个栈
void CleanZhan(Zhan *p)
{
p->=p->base;
}