顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。通常的习惯做法以top=0表示空栈。一般来说,在初始化设空栈时不应限定栈的最大容量。一个较合理的做法:先为栈分配一个基本容量,然后在应用过程中,当栈的空间不足在进行扩展。空栈时的表示为S.top == S.base。
///栈的顺序存储表示
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <malloc.h>
using namespace std;
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef int SElemType;
typedef struct
{
SElemType *base;//在栈构造之前和销毁之后,base的值为NULL
SElemType *top;//栈顶指针
int stacksize;//当前已分配的存储空间,以元素为单位
} SqStack;
//构造一个空栈S
Status InitStack(SqStack &S);
//销毁栈S, 栈S不再存在
Status DestroyStack(SqStack &S);
//把S置为空栈
Status ClearStack(SqStack &S);
//若S为空栈,则返回true,否则返回FALSE
Status StackEmpty(SqStack S);
//返回S的元素个数,及栈的长度
int StackLength(SqStack S);
/*获取栈顶元素,
若栈不空,则用e返回S的栈顶元素,并返回OK,
否则返回ERROR*/
Status GetTop(SqStack S, SElemType &e);
//插入元素e作为新的栈顶元素
Status Push(SqStack &S, SElemType e);
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqStack &S, SElemType &e);
//读出元素
Status vi(SElemType e);
//从栈底到栈顶依次对栈中的每个元素调用函数visit(). 一旦visit()失败, 则操作失败
Status StackTraverse(SqStack S, Status(*visit)(SElemType));
int main()
{
SqStack S;
InitStack(S);
if(StackEmpty(S))
{
printf("创建栈之后, 栈为空\n");
}
for(int i = 0; i < 6; i++)
{
Push(S, i);
}
if(!StackEmpty(S))
{
printf("添加元素之后, 栈不空\n");
}
StackTraverse(S, vi);//遍历栈中元素
int length;//栈的长度
length = StackLength(S);
printf("栈的长度: %d\n", length);
SElemType e;
GetTop(S, e);
printf("栈顶元素: %d\n", e);
Pop(S, e);
printf("删除的栈顶元素: %d\n", e);
StackTraverse(S, vi);//遍历栈中元素
ClearStack(S);
if(StackEmpty(S))
{
printf("清空栈之后, 栈为空\n");
}
DestroyStack(S);
return 0;
}
//构造一个空栈S
Status InitStack(SqStack &S)
{
S.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)
{
printf("存储分配失败!\n");
return ERROR;
}
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
//销毁栈S, 栈S不再存在
Status DestroyStack(SqStack &S)
{
S.base = NULL;
free(S.base);//将S.base释放
S.top = NULL;//将指向栈顶的元素置为空
S.stacksize = 0;//栈已销毁,空间已释放,当前已分配的存储空间为空
return OK;
}
//把S置为空栈
Status ClearStack(SqStack &S)
{
S.top = S.base;
return OK;
}
//若S为空栈,则返回true,否则返回FALSE
Status StackEmpty(SqStack S)
{
if(S.top == S.base)
{
return TRUE;
}
return FALSE;
}
//返回S的元素个数,及栈的长度
int StackLength(SqStack S)
{
return S.top - S.base;
}
/*获取栈顶元素,
若栈不空,则用e返回S的栈顶元素,并返回OK,
否则返回ERROR*/
Status GetTop(SqStack S, SElemType &e)
{
if(S.base == S.top)
{
return ERROR;
}
e = *(S.top - 1);
return OK;
}
//插入元素e作为新的栈顶元素
Status Push(SqStack &S, SElemType e)
{
if(S.top - S.base >= S.stacksize)//栈满,追加存储空间
{
S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(SElemType));
}
if(!S.base)
{
return ERROR;//存储分配失败
}
*S.top = e;
S.top++;
return OK;
}
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqStack &S, SElemType &e)
{
if(S.top == S.base)
{
return ERROR;
}
S.top--;
e = *S.top;
return OK;
}
//读出元素
Status vi(SElemType e)
{
printf("%d ", e);
return OK;
}
//从栈底到栈顶依次对栈中的每个元素调用函数visit(). 一旦visit()失败, 则操作失败
Status StackTraverse(SqStack S, Status(*visit)(SElemType))
{
SElemType e;
printf("遍历栈中元素: ");
while(S.top != S.base)
{
S.top--;
e = *S.top;
if(!(*visit)(e))
{
return ERROR;
}
}
printf("\n");
return OK;
}