一、定义
栈是一种重要的线性结构。咱们可以把它抽象地看成是一种特殊的线性表。只是它比线性表又多了一些要求,具体不同体现在栈是限定仅在表尾进行插入或删除操作的线性表。而线性表就没有此局限性。因此表尾又称为栈顶。表头称为栈底。不含元素的栈称为空栈
二、特点
例S=(a1,a2,a3,```,an),a1称为栈底元素,an称为栈顶元素,即最后一个进栈的就是栈顶元素。同时第一个出栈的也是栈顶元素。因此,栈有后进先出的特点。
三、顺序栈的表现和实现
在学习顺序栈的表现和实现之前,我们需要了解一些栈的基本操作。
InitStack(&S)
功能:构造一个空栈S。
DestroydStack(&S)
功能:销毁栈S。(前提:栈S已存在)
ClearStack(S)
功能:将栈S清空为空栈。(前提:栈S已存在)
StackEmpty(S)
功能:若栈S为空栈,则返回TRUE,否则返回FALSE。(前提:栈S已存在)
StackLength(S)
功能:返回栈S的元素个数,即栈的长度。(前提:栈S已存在)
GetTop(S)
功能:返回S的栈顶元素,不修改栈顶指针。(前提:栈S已存在且非空)
Push(&S,e)
功能:插入元素e为新的栈顶元素。(前提:栈S已存在)
Pop(&S,&e)
功能:删除S的栈顶元素,并用e返回其值。(前提:栈S已存在且非空)
StackTraverse(S)
功能:从栈底到栈顶依次对栈S的每个数据元素进行访问。(前提:栈S已存在且非空)
了解了栈的基本操作之后,我们正式学习顺序栈。
顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。通常习惯的做法是:以top = 0表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C语言作描述语言时,如此设定会带来很大不便,因此令设指针base指示栈底元素在顺序栈中的位置。当top=base时,表示空栈。
顺序栈的定义如下:
//------顺序栈的存储结构------
#define MAXSIZE 100 //顺序栈存储空间的初始分配量
typedef struct
{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize;
}SqStack;
说明:1、base是栈底指针,一直指向栈底,当base的值为NULL时,表明栈不存在;top是栈顶指针,初值指向栈底,每当插入新的栈顶元素时,指针top增1;删除栈顶元素时,指针top减1。因此,栈空时,top=base,都指向栈底;栈非空时,top始终指向栈顶元素的上一个位置。
2、stacksize指示栈可使用的最大容量。
(一)初始化顺序栈
顺序栈的初始化操作就是为顺序栈动态分配一个预定义大小的数组空间。
Status InitStack(SqStack &S)
{//构造一个空栈S
S.base=new SElemType[MAXSIZE];
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=MAXSIZE;
return OK;
}
(二)入栈
顺序栈入栈就是指在栈顶插入一个新的元素。
Status Push(SqStack &S,SElemType e)
{//插入元素e为新的栈顶元素
if(S.top-S.base==S.stacksize) return ERROR;
*S.top++=e;
return OK;
}
(三)出栈
顺序栈出栈就是将栈顶元素删除。
Status Pop(SqStack &S,SElemType &e)
{//删除S的栈顶元素,用e返回其值
if(S.top==S.base) return ERROR;
e=*--S.top; //栈顶指针减1,将栈顶元素赋给e
return OK;
}
(四)取栈顶元素
当顺序栈非空时,此操作返回当前栈顶元素的值,栈顶指针保持不变。
SElemTye GetTop(SqStack S)
{//返回S的栈顶元素,不修改栈顶指针
if(S.top!=S.base)
return *(S.top-1);
}
注意:出栈和取栈顶元素有所不同。出栈是将栈顶元素删除后还要改变栈顶指针,让他指向下一个元素。而取栈顶元素只是取出栈顶元素,不删除该元素,也不改变栈顶指针。
总结顺序栈的优缺点
优点:顺序栈连续存储,空间利用率高。
缺点:不方便数据的增删。