数据结构:栈(数组模拟)

        先使用数组模拟,以便了解,后期再继续写文章,完善链式的栈

栈的定义

        是指限定仅在表尾进行插入删除操作的线性表。所以它和前面的链表以及后面的队列一样,都是线性表,它们都有相同的逻辑结构

        对于栈来说,它的表尾段有着特殊的含义(只能在表尾进行操作),因此我们称其为栈顶。同样的,它的首段则被称为栈底。不含元素的栈,我们一般称其为空栈

        在我们日常生活中,类似栈的结构很常见,

        比方说,在我们编写word文档时的撤销操作,就是栈的结构

         其最下面的" 键入"1" "操作是我们最开始做的,而上面" 键入"回车" "(真的是回车,只是它没显示)的操作则是我们后进行的。因此,我们称" 键入"1" "为栈底元素,而" 键入"回车" "为栈顶元素。因此,栈又叫做后进先出(Last In First Out,LIFO)的线性表

定义 

typedef struct
{
    ElemType data[MaxSize];
    int top;
} SqStack;

        此处的data数组就是我们栈的空间,而top栈顶指针

        栈顶指针:S.top,初始化时设置为S.top==-1;此时,栈顶元素S.data[S.top]

        出栈操作:栈不满时,栈顶指针先加一,再送值到栈顶

        出栈操作:栈非空时,先去栈顶元素,再将栈顶指针减一

        栈空条件:S.top==-1;

        栈满条件:S.top==MaxSize-1;

        栈长:S.top+1;

初始化

void InitStack(SqStack &S)
{
    S.top = -1;
}

判空

bool StackEmpty(SqStack S)
{
    if (S.top == -1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

进栈

bool Push(SqStack &S, ElemType x)
{
    if(S.top==MaxSize-1)
    {
        return false;
    }
    S.data[++S.top] = x;
    return true;
}

        如果说,此时栈不满,那么在入栈之前需要将top指针加一,才能入栈

出栈

bool Pop(SqStack &S, ElemType &x)
{
    if (S.top == -1)
    {
        return false;
    }
    x = S.data[S.top--];
    // x = S.data[S.top];
    // S.top--;
    return true;
}

读栈顶元素

bool GetTop(SqStack &S, ElemType &x)
{
    if(S.top==-1)
    {
        return false;
    }
    x = S.data[S.top];
    return true;
}

出栈和读栈顶元素的区别:

        就栈顶指针的位置没有发生变化,读栈顶元素就只是读了一下栈顶的元素,并没有将其弹出;而出栈的操作移动了指针,同时也读取了栈顶元素

        此处的top指的是栈顶元素,所以,进栈操作为S.data[++S.top] = x,出栈操作为x = S.data[S.top--]。如果栈顶指针初始化为S.top=0(即top指针指向栈顶元素的下一位置),入栈操作就会变成S.data[S.top++] = x,出栈操作为x = S.data[--S.top],同时栈空和满栈的条件也会发生变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值