栈和队列篇·第一章·栈·顺序栈其一

(次日)
"那么,按照说好的,这是你应得的"(递),"阿里嘎多!",那么这就是我赚的第一桶金了——接委托真不错。
(回到旅店)
"考核应该没什么问题,先准备下下一个旅行的地方吧,嗯,是栈和队列联邦:

定义

和线性表一致,栈也拥有顺序、链式两种存储的表示方法,分别称为顺序栈链栈

顺序栈

利用一组连续的存储单元依次存放从栈底栈顶的数据元素,同时用一个栈顶指针top用以表示当前的栈顶的位置。

栈底的位置可以设置在任何一端,而栈顶的位置是随着出、入栈而动态变化的。通常将数组下标为0的一端表示栈底,栈顶指针top=0的时候称之为空栈,下来是术式说明:

#define Stack_Init_Size 10 //定义初始大小
#define Stack_Increment 10 //存储空间分配增量
typedef int Elemtype;      //定义元素类型
typedef struct stacklist
{
    Elemtype * stackdata;  //栈中数据元素存储空间(一维数组)的起始地址
    int top;               //栈顶指针,实际上是栈顶位置的下标
    int stacksize;         //栈当前的可用大小,初始化交给Stack_Init_Size来定义
}SeqStack;

所以,并没有开始就固定栈存储空间的大小,而是使用指针stackdata来动态的分配,在初始化栈的时候,为其分配Stack_Init_Size的大小的栈存储空间。在使用完后可以继续增加Stack_Increment的存储空间,栈的可用空间可以用stacksize定义。

在开始的时候,栈顶为0,每当有元素入栈的时候就会自增,反之则自减,变化如图所示:

栈存储的示意图

关于具体术式方面:

初始化顺序栈
int InitStack(SeqStack *S){
    if(!S)return 0;//顺序栈无效
    //分配内存空间
    S->stackdata=(Elemtype*)malloc(Stack_Init_Size * sizeof(Elemtype));
    if(!S->stackdata)return 0;//内存分配错误
    S->top=0;//初始化栈顶指针
    S->stacksize=Stack_Init_Size;//设置当前栈的大小
    return 1;
}

以上为初始化分配由Stack_Init_Size指定大小的存储空间,并设置好栈顶指针

//1.14

你可能感兴趣的:(栈和队列篇·第一章·栈·顺序栈其一)