栈的基本概念
- 栈(stack)的定义:只允许在一端进行
插入
或者删除
操作的线性表
- 栈的特点:后进先出
栈顶(top):允许插入和删除的一端
栈底(bottom):不允许插入和删除的一端
空栈:不含任何数据元素的栈称为空栈
- 逻辑结构:和普通线性表一样,元素之间是有位序的,插入和删除不同
- 栈的
基本操作
–创销、增删改查:
初始化栈:构建一个空栈S,分配内存空间
销毁操作:销毁栈并释放栈S所占的内存空间
插入(Push)操作:进栈,若栈S未满,则将要插入的元素x加入其中使之成为栈顶
删除(Pop)操作:出栈,若栈S非空,则弹出栈顶元素
查找(GetPop):读栈顶元素
顺序栈的实现(顺序存储结构)
- 栈的本质是一个线性表,线性表有两种存储形式,栈也分为栈的顺序存储结构和栈的链式存储结构
- 顺序栈缺点:栈的大小不可改变
顺序栈的初始化
typedef struct {
ElemType data[MAXSIZE];
int top;
}SqStack;
void InitStack(SqStack &S){
S.top = -1;
}
bool EmptyStack(SqStack S){
if(S.top==-1)
return true;
else
return false;
}
void testStack(){
SqStack S;
InitStack (S);
}
进栈操作
bool Push(SqStack &S, ElemType x){
if(S.top==MAXSIZE-1)
return false;
S.top=S.top+1;
S.data[S.top]=x;
return true;
}
出栈操作
bool Pop(SqStack &S,ElemType &x){
if(S.top==-1)
return false;
x=S.data[S.top];
S.top=S.top-1;
return true;
}
读取栈顶元素
bool GetStack(SqStack S,ElemType x){
if(S.top==-1)
return false;
x=S.data[S.top];
return true;
}
链栈的实现(链式存储结构)
- 链栈:栈的链式存储结构
- 链栈优点:方便扩建
- 链栈缺点:不可随机读取
链栈的初始化
typedef struct StackNode{
ElemType data;
struct StackNode *next;
}StackNode;
typedef struct{
StackNode *top;
}LinkStack;
bool InitLinkStack(LinkStack &S){
StackNode *L=(StackNode*)malloc(sizeof(StackNode));
if(L==NULL)
return false;
L->next = NULL;
S.top=L;
}
bool Empty(LinkStack S){
if(S.top==NULL)
return true;
else
return false;
}
void testLinkStack(){
LinkStack S;
InitLinkStack(S);
}
链栈的插入
bool EnStack(LinkStack &S, ElemType e){
if (S.top==NULL)
return false;
StackNode *n=(StackNode*)malloc(sizeof(StackNode));
if (n==NULL)
return false;
n->data = e;
n->next = S.top;
S.top = n;
return true;
}
链栈的删除
bool DelStack(LinkStack &S,ElemType &e){
if (S.top==NULL)
return false;
StackNode *p=S.top;
e = p->data;
if(p->next!=NULL)
S.top = p>next;
free(p);
return true;
}