目录
[栈 3+5*6](#栈 3+5*6)
[5、顺序栈 SeqStack](#5、顺序栈 SeqStack)
[6、链式栈 LinkStack](#6、链式栈 LinkStack)
栈 3+5*6
1、定义
栈是限定仅在表尾进行插入和删除操作的线性表
栈顶:允许操作的一端
栈底:不允许操作的一端
入栈、出栈(压栈、弹栈)
2、特性
先进后出,后进先出
3、应用
回溯类、递归类、优先级
4、类型:空增栈、空减栈、满增栈、满减栈
增栈:当元素入栈之后,top指示器表示的地址是慢慢增大的
减栈:当元素入栈之后,top指示器表示的地址是慢慢减小的
空栈:top指示器,指向的地址,是新元素待插入的地址
满栈:top指示器,指向的地址,是最后一次入栈元素的地址
链栈:
5、顺序栈 SeqStack
连续的存储区域
CreateSeqStack
cpp
/**
* @brief 创建顺序栈
*
* @param len 栈的容量
* @return SeqStack* 新创建栈的指针,NULL失败
*/
SeqStack* CreateSEqStack(int len)
{
SeqStack* ss = malloc(sizeof(SeqStack));
if (NULL == ss)
{
printf("CreateSeqStack malloc1 error\n");
return NULL;
}
ss->head = malloc(sizeof(DATATYPE) * len);
if (NULL == ss->head)
{
printf("CreateSeqStack malloc2 error\n");
return NULL;
}
ss->tlen = len;
ss->top = 0;
return ss;
}
IsEmptySeqStack
cpp
/**
* @brief 判断栈是否为空
*
* @param ss 待操作的顺序栈
* @return int 0空 1满
*/
int IsEmptySeqStack(SeqStack* ss)
{
return 0 == ss->top;
}
IsFullSeqStack
cpp
/**
* @brief 判断栈是否满
*
* @param ss 待操作的顺序栈
* @return int 0满 1空
*/
int IsFullSeqStack(SeqStack* ss)
{
return ss->tlen == ss->top;
}
PushSeqStack
cpp
/**
* @brief 入栈操作,给栈新增元素
*
* @param ss 需要操作的顺序栈指针
* @param newdata 需要入栈的数据
* @return int 0成功 1失败
*/
int PushSeqStack(SeqStack* ss, DATATYPE* newdata)
{
if (IsFullSeqStack(ss))
{
printf("PushSeqStack error\n");
return 1;
}
memcpy(&ss->head[ss->top], newdata, sizeof(DATATYPE));
ss->top++;
return 0;
}
PopSeqStack
cpp
/**
* @brief 出栈操作
*
* @param ss 待操作的顺序栈
* @return int 0成功 1失败
*/
int PopSeqStack(SeqStack* ss)
{
if (IsEmptySeqStack(ss))
{
printf("PopSeqStack error\n");
return 1;
}
ss->top--;
return 0;
}
GetTopSeqStack
cpp
/**
* @brief 获得栈顶元素
*
* @param ss 待操作的顺序栈
* @return DATATYPE* 返回栈顶元素的指针,NULL失败
*/
DATATYPE* GetTopSeqStack(SeqStack* ss)
{
if (IsEmptySeqStack(ss))
{
printf("GetTopSeqStack error\n");
return NULL;
}
return &ss->head[ss->top - 1];
}
DestroySeqStack
cpp
int DestroySeqStack(SeqStack* ss)
{
}
6、链式栈 LinkStack
CreateLinkStack
cpp
LinkStack* CreateLinkStack(int len)
{
LinkStack* ls = malloc(sizeof(LinkStack));
if (NULL == ls)
{
printf("malloc1 error\n");
return NULL;
}
ls->top = NULL;
ls->clen = 0;
return ls;
}
IsEmptyLinkStack
cpp
int IsEmptyLInkStack(LinkStack* ls)
{
return 0 == ls->top;
}
PushLinkStack
cpp
int PushLinkStack(LinkStack* ls, DATATYPE* newdata)
{
LinkStackNode* newnode = malloc(sizeof(LinkStackNode));
if (NULL == newnode)
{
printf("malloc1 error\n");
return 1;
}
memcpy(&newnode->data, newdata, sizeof(DATATYPE));
newnode->next = NULL;
newnode->next = ls->top;
ls->top = newnode;
ls->clen++;
return 0;
}
PopLinkStack
cpp
int PopLinkStack(LinkStack* ls)
{
if (IsEmptyLInkStack(ls))
{
return 1;
}
LinkStackNode* tmp = ls->top;
ls->top = ls->top->next;
free(tmp);
ls->clen--;
return 0;
}
GetTopLinkStack
cpp
DATATYPE* GetTopLinkStack(LinkStack* ls)
{
if (IsEmptyLInkStack(ls))
{
printf(" error\n");
return NULL;
}
return &ls->top->data;
}
DestroyLinkStack
cpp
int DestroyLInkStack(LinkStack* ls)
{
int len=GetSizeLinkStack(ls);
int i=0;
for(i=0;i<len;i++)
{
PopLinkStack(ls);
}
free(ls);
return 0;
}