引言:和线性表类似,栈也有两种存储表示方法,本文介绍栈的顺序存储结构,栈是限定仅在表尾进行插入或删除操作的线性表,换句话说栈的修改是按后进先出(last in first out)的线性表(简称LIFO结构)
一、顺序栈的表示和实现
栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,通常以top=0表示空栈
1.栈的顺序存储表示
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
typedef int SElemType;
typedef struct{
SElemType *base; //在栈构造之前和销毁之后,base的值为NULL
SElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间,以元素为单位
}SqStack;
2.栈的基本操作表示
Status InitStack(SqStack &S) //构造一个空栈
{
S.base=(SElemType*)malloc ((STACK_INIT_SIZE)*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status DestroyStack(SqStack &S) //销毁栈
{
if(S.base)
free(S.base);
S.base=NULL;
return OK;
}
Status ClearStack(SqStack &S) //清空栈
{
S.top=S.base;
return OK;
}
Status StackEmpty(SqStack S) //判断栈是否为空
{
return S.top==S.base;
}
int StackLength(SqStack S) //求栈的长度
{
return S.top-S.base;
}
Status GetTop(SqStack S, SElemType &e) //用e返回栈顶元素
{
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return OK;
}
Status Push(SqStack &s,SElemType e) //插入元素e为新的栈顶元素
{
if(s.top-s.base>=s.stacksize)
{
s.base=(SElemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!s.base)
exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return OK;
}
Status Pop(SqStack &S,SElemType &e) //删除栈顶元素,用e返回其值
{
if(S.top==S.base)
return ERROR;
e=*--S.top;
return OK;
}
二、C++标准模板库(stack模板类)
stack模板类在头文件stack中声明(#include<stack>
),是一个适配器类,它给底层类(默认情况下为vector)提供了典型的栈接口,它不允许随机访问栈元素、不允许遍历栈。它把使用限制在定义栈的基本操作上,即可以将压入推到栈顶、从栈顶弹出元素、查看栈顶的值、检查元素数目和测试栈是否为空
如果要使用栈中的值,必须首先使用top()来检索这个值,然后使用pop()将它从栈中删除