栈的顺序存储结构
1.顺序栈的存储结构
#define MAXSIZE 100 //顺序栈存储空间的初始分配
typedef struct{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈可用的最大容量
}SqStack;
2.顺序栈的初始化
初始化就是为顺序栈动态分配一个预定义大小的数组空间
栈属于逻辑结构
数组为顺序存储结构(存储/物理结构:逻辑结构在计算机中的存储形式)
具体关系见本人关于数据结构第一章图解:传送门
Status InitStack(SqStack &S){ //形参使用引用&,以下函数对S操作就是对实参的操作
S.base = new SElemType[MAXSIZE]; //为栈分配一个数组
//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
//数组名为指向数组第一个元素的指针,所以将这里的指针赋值给指向栈第一个元素的栈底指针
if(!S.base) //判断是否分配成功
exit(OVERFLOW);
S.top = S.base; //初始化时SqStack S为空栈(栈内没有任何元素)
S.stacksize = MAXISIZE; //将栈的大小置为最大容量MAXSIZE
return OK; //返回初始化状态(是否成功完成初始化)
}
3.顺序栈的入栈操作
入栈(进栈/压栈)是指在栈顶插入一个新元素
Status Push(SqStack &S, SElemType e){ //形参使用引用&,以下函数对S操作就是对实参的操作
if(S.top - S.base == S.stacksize) //判断栈是否已满
return ERROR;
*S.top++ = e; //元素e压入栈顶,栈顶指针top加1
//后置式递增要拷贝一个临时对象,S.top调用栈顶指针,*(S.top)解引用
//将e赋值给临时对象(*S.top),然后再进行自增++
return OK;
}
4.顺序栈的出栈操作
出栈就是将栈顶元素删除
Status Pop(SqStack &S, SElemType &e){ //形参使用引用&,以下函数对S和e操作就是对实参的操作
if(S.top == S.base) //判断栈是否为空
return ERROR;
e = *--S.top; //栈顶指针先减1,然后将栈顶元素赋值给e
return OK;
}
5.取栈顶元素
当栈非空时,返回当前栈顶元素的值。栈顶指针保持不变
SElemType GetTop(SqStack S){
if(S.top != S.base) //栈非空
return *(S.top-1);
}