栈(LIFO)
一种特殊的线性表,限定在表尾进行插入或删除
-表尾称为栈顶,是浮动的。表头称为栈底,是固定的。
-栈插入删除元素不需要移动数据元素。
栈的抽象数据类型
ADT Stack{
数据对象:D={ai|ai∈ElemSet,i=1,2,…n,n>=0}
数据关系:R={<ai-1,ai>|ai-1,ai∈D,i=1,2,…n}
基本操作:
InitStack(&S); //构造一个栈
DestroyStack(&S); //销毁栈
StackEmpty(S); //判栈空,若空返回TRUE,否则返回FALSE
StackLength(S); //返回栈的长度
GetTop(S,&e); //返回栈顶元素
Push(&S,e); //插入元素e为新的栈顶元素
Pop(&S,e) //删除栈顶元素,并返回改值
}ADT Stack
-栈的顺序表示:用一组连续的存储单元依次存放栈中每个数据元素。
-实现
const MAXSTACK=100;
typedef struct{
SElemType Data[MAXSTACK];
int top;
}SqStack;
-初始化栈S
void InitStack(SqStack &S){
S.top=0;
}//InitStack
-入栈
void Push(SqStack &S,SElemType e){
if(S.top==MAXSTACK) return OVERFLOW;
else{
S.Data[S.top]=e;
S.top++;
}
}//Push
-出栈
void Pop(SqStack &S,SElemType e){
if(StackEmpty(S)) return ERROR;
else {
S.top--;
e=S.Data[S.top];
}
}//Pop
-返回栈顶元素
void GetTop(SqStack S,SElemType e){
if(StackEmpty(s)) return ERROR;
else e=S.Data[S.top-1];
}//GetTop
-判栈空,若空返回TRUE,否则返回FALSE
int StackEmpty(SqStack S){
if(S.top==0) return TRUE;
else return FALSE;
}//StackEmpty
-栈的链式表示:
-实现
typedef struct node{ //数据元素
SElemType data;
struct node *next;
}SNode;
typedef struct stack{ //栈顶指针
SNode *top;
}SqStack;
-初始化S
void InitStack(SqStack &S){
S.top=null;
}
-入栈
void Push(SqStack &S,SElemType e){
p=new SNode;
if(!p) return ERROR;
else{
p->data=e;
p->next=s->top;
s-top=p;
}
}//Push
-出栈
void Pop(SqStack *s,SElemType &e){
if(StackEmpty(s))return ERROR;
else{
e=s->top->data;
p=s->top;
s->top=p->next;
delete p;
}
}
-获取栈顶元素内容
void GetTop(SqStack S,SElemType &e){
if(StackEmpty(S)) return ERROR;
else e=S.top->data;
}//GetTop
-判断栈S是否为空
int StackEmpty(SqStack S){
if(S.top==null) return TRUE;
else return FALSE;
}//StackEmpty