栈
栈的抽象数据类型定义(ADT):
栈的结构体定义:
ADT Stack{
数据对象:D={ai | ai∈ElemSet , i=1,2,3,4…,n,n≥0}
数据关系:R1={<ai-1,ai> | ai-1,ai∈D,i=2,…,n}
约定an端为栈顶,a1端为栈底
基本操作:
InitStack(&S)
初始条件:
操作结果:
DestoryStack(&S)
初始条件:
操作结果:
ClearStack(&S)
初始条件:
操作结果:
StackEmpty(S)
初始条件:
操作结果:
StackLength(S)
初始条件:
操作结果:
GetTop(S,&e)
初始条件:
操作结果:
Push(&S,e)
初始条件:
操作结果:
Pop(&S,e)
初始条件:
操作结果:
StackTraverse(S,visit())
初始条件:
操作结果:
}ADT Stack
顺序栈(SqStack)
基本操作实现
结构体定义
//顺序栈的存储结构定义
typedef struct LNode {
ElemType *base,*top;
int stacksize;
} SqStack;
构造一个空栈
//InitStack构造一个空栈S
Status InitStack(SqStack &S)
{
// TODO (#1#): 构造一个空栈S,不带头结点
S.base=(ElemType *)malloc(STACK_H_INCLUDED*sizeof(ElemType));
if(S.base==NULL)return ERROR;
S.top=S.base;
S.stacksize=STACK_H_INCLUDED;//栈的容量
return OK;
//-------------------------------------
}
StackEmpty判断栈空
//若栈S为空返回TRUE,否则FALSE
Status StackEmpty(SqStack S)
{
// TODO (#1#): 若栈S为空返回TRUE,否则FALSE
if(S.top==S.base)return TRUE;
return ERROR;
//-------------------------------------
}
StackLength返回栈S中的元素个数
//返回栈S中的元素个数
int StackLength(SqStack S)
{
// TODO (#1#): 返回栈S中的元素个数
return S.top-S.base;
//-------------------------------------
}
GetTop返回栈顶元素
//用e返回栈顶元素
// 前提:栈S存在且不空
Status GetTop(SqStack S, ElemType &e)
{
// TODO (#1#):若栈S不空,则用e返回栈顶元素
if(S.top!=S.base)
e=*(S.top-1);
return OK;
//-------------------------------------
}
Push入栈
//元素e入栈S
Status Push(SqStack &S, ElemType e)
{
// TODO (#1#): 插入元素e作为新的栈顶
if(S.top-S.base<S.stacksize)
*S.top=e;
S.top++;
return OK;
//-------------------------------------
}
Pop出栈
//S出栈用e返回出栈元素
// 前提:栈S存在且不空
Status Pop(SqStack &S, ElemType &e)
{
// TODO (#1#):若栈S不空,则删除栈顶元素用e返回
if(S.top==NULL)return ERROR;
S.top--;
e=*S.top;
return OK;
//-------------------------------------
}
链栈(LinkStack)
基本操作实现
链栈的存储结构定义
//链栈的存储结构定义
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkStack;
InitStack初始化空栈
//构造一个空栈S
Status InitStack(LinkStack &S)
{
// TODO (#1#): 构造一个空栈S,不带头结点
S=NULL;
return OK;
//-------------------------------------
}
StackEmpty判断栈空
//若栈S为空返回TRUE,否则FALSE
Status StackEmpty(LinkStack S)
{
// TODO (#1#): 若栈S为空返回TRUE,否则FALSE
if(S==NULL)
{
return TRUE;
}else{
return FALSE;
}
//-------------------------------------
}
StackLength返回栈S中的元素个数
//返回栈S中的元素个数
int StackLength(LinkStack S)
{
// TODO (#1#): 返回栈S中的元素个数
LinkStack L;
L=S;
int j=0;
while(L){
L=L->next;
j++;
}
return j;
//-------------------------------------
}
GetTop取栈顶
//用e返回栈顶元素
// 前提:栈S存在且不空
Status GetTop(LinkStack S, ElemType &e)
{
// TODO (#1#):若栈S不空,则用e返回栈顶元素
if(S==NULL)
{
return ERROR;
}else{
e= S->data;
}
//-------------------------------------
}
Push入栈
//元素e入栈S
Status Push(LinkStack &S, ElemType e)
{
// TODO (#1#): 插入元素e作为新的栈顶
LinkStack T;
T=(LinkStack)malloc(sizeof(LNode));
if(!T)return ERROR;
T->data=e;T->next=NULL;
T->next=S;S=T;
return OK;
//-------------------------------------
}
Pop出栈
//S出栈用e返回出栈元素
// 前提:栈S存在且不空
Status Pop(LinkStack &S, ElemType &e)
{
// TODO (#1#):若栈S不空,则删除栈顶元素用e返回
LinkStack T;
T=S;
S=T->next;
e=T->data;
free(T);
return OK;
//-------------------------------------
}