准备工作
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<windows.h>
//函数结果状态字符
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
顺序栈的表示(用指针来操作数组中的元素)
#define MAXSIZE 100
typedef struct
{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈可用最大容量
}SqStack;
顺序栈的初始化
Status InitStack(SqStack &S)
{
S.base = new SElemType[MAXSIZE];
//S.base = (SElemType*)malloc(MAXSIZE*sizeof(SElemType));
if(!S.base) //如果存储分配失败
exit(OVERFLOW);
S.top = S.base; //让栈顶指针等于栈底指针
S.stacksize = MAXSIZE;
return OK;
}
顺序栈判断栈是否为空
Status StackEmpty(SqStack S)
{
//若栈为空,返回TRUE;否则返回FALSE
if(S.top == S.base)
return TRUE;
else
return FALSE;
}
求顺序栈的长度
int StackLength(SqStack S)
{
return S.top - S.base;
}
清空顺序栈
Status ClearStack(SqStack S)
{
if(S.base) S.top = S.base;
return OK;
}
销毁顺序栈
Status DestroyStack(SqStack &S)
{
if(S.base)
{
delete S.base; //将数组回归内存
S.stacksize = 0;
S.base = S.top = NULL;
}
return OK;
}
顺序栈的入栈
1.判断是否栈满,若满则出错(上溢)
2.元素e压入栈顶
3.栈顶指针加1
Status Push(SqStack &S, SElemType e)
{
if(S.top-S.base == S.stacksize)//栈满
return ERROR;
*S.top++ = e;
return OK;
}
顺序栈的出栈
1.判断是否栈空,若空则出错(下溢)
2.获取栈顶元素e
3.栈顶指针减一
Status Pop(SqStack &S, SElemType &e)
{
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回ok;否则返回error
if(S.top==S.base) //if(StackEmpty(S))
return ERROR;
e = *--S.top; //指针先下移,再取元素
return OK;
}