数据结构之顺序栈
一、栈的操作
栈是一种在表尾进行插入、删除操作的线性表,是先进后厨
(一)数据结构定义
ADT Stack {
// 数据对象
D = {ai| ai∈ ElemSet, i = 1,2,3...n, n>=0}
// 数据关系
R1 = {< ai-1, ai>| ai - 1, ai ∈ D, i = 2,...n }
//an 为栈顶, a1为栈底
}
(二)栈的操作

(三)顺序栈的表示和实现
同一班线性表的顺序存储结构完全相同,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。栈底一般在低地址段。
设置top指针,指示栈顶元素在顺序栈中的位置,但是为了操作方便,top指示真的的栈顶元素之下的下标地址
设置base指针,指示栈底元素在顺序表中的位置
用stacksize表示栈可使用最大的容量
空栈的标志:base = top
满栈的标准:top - base =stacksize
#define MAXSIZE 100
typedef struct{
SElemType *base // 栈底指针
SElemType *top // 栈顶指针
int stacksize // 栈可用最大容量
}
1.顺序栈的初始化
Status InitStack (SqStack &S) { // 构建一个空栈
S.base = new SElemTypeType [MAXSIZE] // 在栈底创建为栈分配空间
if (!S.base) exit (OVERFLOW) // 如果没有空间就报错
S.top = S.base // 初始化,将栈底指针 赋值给 栈顶指针
S.stacksize = MAXSIZE // 将最大值给栈的空间变量
}
2.判断栈是否为空
Status StackEmpty (SqStack S) {
if(S.stop == S.base) return TURE //判断栈底指针是否等于栈顶指针
else return FALSE
}
3.求顺序栈的长度
int StackLength(SqStack S) {
return S.top - S.base //栈顶位置 减去 栈底位置
}
4.清空顺序栈
Status ClearStack (Sqstack S) {
if(S.base) S.top = S.base //如果栈不为空,直接将栈顶指针 移动到 栈底指针
return OK
}
5.销毁顺序栈
Status DestroyStack(SqStack &S) {
if(S.base) { // 销毁前判断是否存在
delete S.base // 销毁栈的存储
S.stacksize = 0
S.base = S.top = NULL
}
return OK
}
6.顺序栈的入栈和出栈
// 入栈
Status Push(SqStack &S,ElemType e) {
if(S.stop - S.base == S.stacksize) return ERROR //入栈之前先判断是否栈满
*S.top++ = e //将值 赋值 给栈顶指针并且指针上移
return OK
}
// 出栈
Status Pop(SqStack &S,ElemType &e) {
if(S.stop == S.base) return ERROR //出栈之前先判断是否栈空
e = *--S.top //将栈顶指针 的值赋值给出栈元素 并且指针下移
return OK
}

浙公网安备 33010602011771号