栈的定义与特点
定义:栈是仅限定在表尾进行插入或删除的线性表。
栈顶:表尾端。栈头:表头端。
特点:后进先出(Last In First Out,LIFO)。
栈的表示操作和实现
栈的类型定义
抽线数据类型定义:
ADT Stack{
数据对象:D={ai|ai∈Element,i=1,2,...,n,n>=0)
数据关系:R={<ai-1,ai>|ai-1,ai∈D,i=2,...,n}
约定an为栈顶,ai为栈底。
基本操作:
InitStack(&S)
构造一个空栈
DestroyStack(&S)
初始条件:栈S以存在
造作结果:栈S被销毁
ClearStack(&S)
初始条件:栈S以存在
造作结果:将S清为空栈
StackEmpty(&S)
初始条件:栈S以存在
造作结果:若S为空栈,返回true,否则返回false
StackLength(S)
初始条件:栈S以存在
造作结果:返回S的元素个数,即栈的长度
GetTop(S)
初始条件:栈S以存在且非空
造作结果:返回S的栈顶元素,不修改栈顶指针
Push(&S,e)
初始条件:栈S以存在且非空
造作结果:插入元素e为新的栈顶元素
Pop(&S,e)
初始条件:栈S以存在且非空
造作结果:删除S的栈顶元素,并用e返回其值
StackTraverse(S)
初始条件:栈S以存在且非空
造作结果:从栈顶到栈底依次对S的每个元素进行访问
}ADT Stack
顺序栈的表示和实现
储存结构
#define MAXSIZE 100
typedef struct{
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize;//栈可用的最大容量
}SqStack;
base为栈底指针,始终指向栈底,base值为NULL,表示栈结构不存在。
top为栈顶指针,其初值指向栈底,插入新的栈顶元素时,指针top加1,删除时,top减一。
栈空时,base == top,栈非空时,top始终指向栈顶元素的上一位置。
初始化
Status InitStack(SqStack &S){
S.base = new SElemType[MAXSIZE];
if(!S.base)
return ERROR;
S.base = S.top;
S.stacksieze = MAXSIZE;
return OK;
}
销毁
Status DestroyStack(SqStack &S){
if(S.base){
delete S.base;
S.stacksize = 0;
S.base = S.top = NULL;
}
return OK;
}
清空
Status ClearStack(&S){
if(S.base == NULL) {
cout<<"顺序栈不存在!"<<endl;
return FALSE;
} else {
while(S.top != S.base) {
*(S.top) = 0;
S.top--;
}
*(S.base) = 0;
cout<<"清空成功!"<<endl;
return OK;
}
}
判空
bool StackEmpty(SqStack S){
if(S.base==S.top)
return true;
else
return false;
}
求栈长(栈中元素的个数)
int StackLength(SqStack S){
return S.top - S.base;
}
取栈顶元素
SElemType Gettop(SqStack S){
if(S.top != S.base)
return *(S.top-1);
}
入栈
Status Push(SqStack &S,SElemType e){
if((S.top - S.base) == MAXSIZE )
return ERROR;
*S.top++ = e;
return OK;
}
出栈
Status Pop(SqStack &S,SElemType &e){
if(S.base == S.top)
return ERROR;
e = *S.top--;
return OK;
}
遍历
Status StackTraverse(SqStack S){
SqStack *p;
p = S.base;
whlie(p != S.top ){
p++;
}
return OK;
}
链式栈的表示和实现
储存结构
typedef struct StackNode{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStack;
初始化
Status InitStack(LinkStack &S){
S = NULL;
return OK;
}
销毁
Status DestroyStack(LinkStack &S){
if(S == NULL)
return ERROR;
StackNode *p;
while(S!= NULL)
{
p = S;
S = S->next;
delete p;
}
return OK;
}
清空
Status ClearStack(LinkStack &S){
if(S == NULL)
return ERROR;
StackNode *p;
while(*S){
p = S;
S = S->next;
delete p;
}
*S = NULL;
return OK;
}
判空
bool StackEmpty(&S){
if(S == NULL)
return true;
else
return false;
}
求栈长(栈中元素的个数)
int StackLength(LinkStack S){
int i = 0;
whlie(S != NULL){
S = S->next;
i++;
}
return i;
}
取栈顶元素
SElemType Gettop(LinkStack S){
if(S)
return S->data;
}
入栈
Status Push(LinkStack &S,SElemType e){
StackNode *p = new StackNode;
p->data = e;
p->next = S;
S = p;
return OK;
}
出栈
Status Pop(LinkStack &S,SElemType &e){
if(S == NULL)
return ERROR;
e = S->data;
StackNode *p;
p = S;
S = S->next;
delete p;
return OK;
}
遍历
Status StackTraverse(LinkStack S){
while(S != NULL){
S=S->next;
}
return OK;
}