1、栈是限定仅在表尾进行插入和删除操作的线性表。是一种特殊的线性表。表头端称为栈底(bottom),表尾端称为栈顶(top)。特点是一种后进先出的线性表。
2、栈的抽象数据类型的定义:
ADT Stack{
数据对象:D={ai | ai∈ElemSet,i=1,2,。。。。n}
数据关系:R={ | ai-1, ai∈D, i = 2, ..., n }
基本操作:
initStack(&S)
操作结果:构造一个空栈S;
DestoryStack(&S)
初始条件:栈S已存在。
操作结果:销毁栈S。
ClearStack(&S)
初始条件:栈S已存在
操作结果:将栈S置为空栈
StackEmpty(S)
初始条件:栈S已存在
操作结果:若栈S为空栈,返回True ,否则返回false。
StackLength(S)
初始条件:栈S已存在
操作结果:返回S的元素个数,即长度。
GetTop(S,&e)
初始条件:栈S已存在且非空
操作结果:用e返回S的栈顶元素
Push(&S,e)
初始条件:栈S已存在
操作结果:将e插入为S的新的栈顶元素。
Pop(&S,&e)
初始条件:栈S已存在,且非空
操作结果:删除栈顶元素,并用e返回
}ADT Stack
3、顺序栈:即栈的顺序存储结构,用一组地址连续的存储单元依次存储自栈底到栈顶的数据元素。 top指针是栈顶指针,base指针是栈底指针,一般top=0,或者top=base,为空栈。base的值为NULL,表示栈结构不存在。
————————栈的顺序存储表示——————————
#define STACK_INNT_SIZE 100
#define STACKINCREMENT 10
typedef struct {
ElemType * base;//在构造前或者销毁后base=NULL
ElemType *top;//栈顶指针
int stacksize;
}SqStack;
————————基本操作的算法描述——————————
Status InitStack(SqStack &S)//初始化
{
S.base=(ElemType *)malloc(STACK_INNT_SIZE * sizeof(ElemType));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INNT_SIZE;
return OK;
}
Status GetTop(SqStack S,ElemType e)//得到栈顶元素
{
if(S.top==S.base) return ERROR;
e=*(S.top-1);
return OK;
}
Status Push(SqStack &S,ElemType e)//入栈
{
if(S.top-S.base>=S.stacksize)
{
S.base=(ElemType *)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof(ElemType));
if(!S.base) exit(OVERFLOW);
S.top=S.base + S.stacksize;
S.stacksize +=STACKINCREMENT;
}
*S.top ++ =e;
return OK;
}
Status Pop(SqStack &S,ElemType &e)//出栈
{
if(S.top==S.base)return ERROR;
e=*--S.top;
return OK;
}
————————链栈的基本操作——————————————
Status InitStack(&S)//初始化构造空链栈
{
S=NULL;
return OK;
}
Status Push(&S,e)//入栈
{
P= new StackNode;
P->data=e;
P->next=S;
S=P;
return OK;
}
Status Pop(&S,&e)//出栈
{
if(S=NULL) return ERROR;
e=S.data;
p=S;
S=S.next;
delete p;
}