数据结构之顺序栈

一、栈的操作

栈是一种在表尾进行插入、删除操作的线性表,是先进后厨

(一)数据结构定义

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
}
posted @ 2022-03-24 23:41  铜须的编程生活  阅读(227)  评论(0)    收藏  举报