目录
一. 前言
简而言之,顺序栈就是栈的顺序存储,链栈就是栈的链式存储。
二.顺序栈
下面我们来看下顺序栈的结构定义:
typedef char SElemType;
#define MAXSIZE 100
typedef struct{
SElemType * base; //栈底指针
SElemType * top; //栈顶指针
int stacksize; //栈可用的最大容量
}SqStack;
其中的SElemType就表示用户自己所定义的数据类型。
因为栈都满足后进先出的特点,所以我们一般操作的都是我们的栈顶指针top。当我们的栈顶指针top==栈底指针base的时候,就表示这是个空栈。而当我们的top-base==stacksize的时候,就表示这个栈已经满了,就不能执行如入栈等操作了。
下面我们来看下顺序栈的初始化,如下所示:
int InitStack(SqStack &S){
S.base=new SElemType[MAXSIZE]; //给栈底分配空间
if(!S.base) return -1;
S.top=S.base; //初始时,栈顶指针等于栈底指针
S.stacksize=MAXSIZE;
}
判断顺序栈是否为空栈的算法如下:
int StackEmpty(SqStack S){
if(S.top==S.base)
return true; //栈为空的时候,返回true
else
return false;
}
求顺序栈的长度算法如下:
int StackLength(SqStack S){
return S.top-S.base; //栈顶指针减去栈底指针就是元素个数
}
清空顺序栈的算法如下:
int ClearStack(SqStack S){
if(S.base) S.top=S.base; //栈为空的条件
return 1;
}
销毁顺序栈的算法如下:
int DestroyStack(SqStack&S){
if(S.base){
delete S.base;
S.stacksize=0;
S.base=S.Top=NULL;
}
return 1;
}
顺序栈的入栈:
int Push(SqStack&S,SElemType e){
if(S.top-S.base==S.stacksize) return -1; //栈满时,入不了栈
*S.top++=e;
return 1;
}
顺序栈的出栈:
int Pop(SqStack&S,SElemType &e){
if(S.top==S.base)
return -1;
e=*--S.top; //因为top指向有数据的上一位
return 1;
}
三. 链栈
链栈是一种特殊的单链表,只能在链表的头部进行操作。
下面我们来看下链栈的结构定义:
typedef struct StackNode{
SELemType data;
struct StackNode* next;
}StackNode,*LinkStack;
链栈的特点如下所示:
下面我们来看下链栈的初始化:
void InitStack(LinkStack&S){
S=NULL;
return 1;
}
只需要让链栈指向空指针即可。
判断链栈是否为空:
int StackEmpty(LinkStack S){
if(S==NULL) return true;
else return false;
}
链栈的入栈:
int Push(LinkStack &S,SElemType e){
StackNode* p=new StackNode; //生成新结点p,并分配好空间
p->data=e; //将新结点的数据域置为e
p->next=S; //将新结点插入栈顶
S=p; //修改栈顶指针
return 1;
}
链栈的出栈:
int Pop(LinkStack&S,SElemType &e){
if(S=NULL) return -1;
e=S->data; //将栈顶的值取出
StackNode* p=S; //将此时的栈顶指针保存
S=S->next; //取出栈顶的指针后,栈顶的指针需要更改
delete p; //释放空间
return 1;
}
取栈顶元素
SElemType GetTop(LinkStack S){
if(S!=NULL)
return S->data;
}
以上便是我们顺序栈和链栈的所有操作算法。