栈的特点嘛大家都知道,先进后出,类似一个桶。。。
这里我们对栈的操作有
1:初始化栈 2:入栈 3:出栈 4:获取栈顶元素 5:展示栈中元素 6:清理栈中元素 7:销毁栈(还有一些static的函数,为了辅助这些操作实现的,我就不列出来了,看代码好吧^ ^)
/*************************************************************************
> File Name: stack.h
> Created Time: Thu 19 Jul 2018 10:25:55 AM CST
************************************************************************/
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#define MaxLength 5
typedef int ElemType;
typedef int Boolean;
#define TRUE 1;
#define FALSE 0;
typedef struct
{
ElemType *base; //栈底指针
ElemType *top; //栈顶指针
int stacksize; //栈大小
}Sqstack;
void InitStack(Sqstack *s);
void PushStack(Sqstack *s,ElemType val);
void GetTop(Sqstack *s);
void PopStack(Sqstack *s);
void ShowStack(Sqstack *s);
void CleanStack(Sqstack *s);
void DestroyStack(Sqstack *s);
/*************************************************************************
> File Name: stack.c
> Created Time: Thu 19 Jul 2018 10:20:24 AM CST
************************************************************************/
#include"stack.h"
void InitStack(Sqstack *s) //初始化一个空的顺序栈
{
assert(s!=NULL);
s->base=(ElemType *)malloc(MaxLength*sizeof(ElemType));
if(!s->base)
{
printf("malloc errer\n");
exit(0);
}
s->top=s->base;
s->stacksize=MaxLength;
}
static void Add_volume(Sqstack *s) //增加栈的容量
{
s->base=(ElemType *)realloc(s->base,s->stacksize*sizeof(ElemType));
if(!s->base)
{
printf("add error\n");
return;
}
s->top=s->base+s->stacksize; //更新top的位置,有可能改变了
s->stacksize*=2;
}
static Boolean Is_Full(Sqstack *s) //判栈满
{
if(s->top-s->base>=s->stacksize)
{
return TRUE;
}
return FALSE;
}
static Boolean Is_Empty(Sqstack *s) //判栈空
{
if(s->top==s->base)
{
return TRUE;
}
return FALSE;
}
void PushStack(Sqstack *s,ElemType val) //元素入栈
{
assert(s!=NULL);
if(Is_Full(s))
{
Add_volume(s);
}
*(s->top)=val;
s->top++;
}
void GetTop(Sqstack *s) //获取栈顶元素
{
assert(s!=NULL);
if(Is_Empty(s))
{
printf("no top elemtype\n");
return;
}
printf("栈顶元素是:%d\n",*(s->top-1));
}
void PopStack(Sqstack *s) //出栈
{
assert(s!=NULL);
if(Is_Empty(s))
{
return;
}
s->top--;
}
void ShowStack(Sqstack *s)
{
if(Is_Empty(s))
{
printf("the stack is empty\n");
return;
}
ElemType *p=s->base;
printf("从栈底开始到栈顶元素依次是:");
while(p!=s->top)
{
printf("%d ",*p);
p++;
}
printf("\n");
}
void CleanStack(Sqstack *s) //清空栈
{
assert(s!=NULL);
s->top=s->base;
}
void DestroyStack(Sqstack *s) //销毁栈
{
assert(s!=NULL);
free(s->base);
s->base=NULL;
s->top=NULL;
s->stacksize=0;
}
/*************************************************************************
> File Name: main.c
> Created Time: Thu 19 Jul 2018 11:55:15 AM CST
************************************************************************/
#include"stack.h"
int main()
{
Sqstack s;
InitStack(&s);
int i=1;
for(;i<=9;i++)
{
PushStack(&s,i*2);
}
ShowStack(&s);
GetTop(&s);
PopStack(&s);
ShowStack(&s);
CleanStack(&s);
ShowStack(&s);
DestroyStack(&s);
return 0;
}