定义简介:
就是特殊的线性表,具有先进后出的特性(就是可以想象成一个空瓶子,在不出意外的情况下先进入瓶子的物体被埋在底下,随着瓶内物品越来越多,先进入的东西自然后出瓶子,要等瓶口的先出才能出),特殊点就是这个线性表只在表尾进行数据的删除与添加,由于他这个特性所以我们给它取名为“栈”,原本的表尾称为“栈顶”,原本的表头称为“栈顶”
初始化操作:
和线性表差不多,也分为初始化为顺序式还是链式,顺序式中用一段连续的存储单元来存储数据元素,其中用top来指示项顶元素的数据位置,当top==0时即该顺序栈为空栈,由于一开始无法确定容量,就先定个基础容量,等到不够再加。展示一下顺序栈的定义:stack(栈) sqstack=sequence stack(顺序栈)
typedef struct{ //用个结构体存放结构体变量
SDataType *base; //栈底指针
SDataType *top; //栈顶指针
int StackSize; //当前已经分配的存储空间,以元素为单位
}SqStack;
第一次数据分配可以用malloc函数来动态分配,判断是否为空栈,可以s.top==s.base,判断是否为满栈,我们可以先定义一个StackSize来表示已分配的储存空间,然后用s.top-s.base=StackSize来判断是否为满栈。
入栈:先要检查是否满栈,如果满栈了还要追加空间,用到realloc函数来添加,用push函数来加如入。具体用一行代码来展示一下:
Status Push(SqStack &s,SDataType e){
SDataType *p;
//首先判断栈是不是满的(上溢)
if(s.top-s.base == s.StackSize){
//追加空间
p = (SDataType *)realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SDataType));
if(!p){
//如果没有找到符合条件的存储空间,则返回error
return OVERFLOW;
}
//成功找到则使s.base指向p
s.base = p; //系统会将原来的内容复制过来
s.top = s.base + s.StackSize;
s.StackSize += STACKINCREMENT;
}
//先插入元素,然后使栈顶指针加 1
*(s.top) = e;
s.top++;
return OK;
}
//出栈
Status Pop(SqStack &s,SDataType &e){
//判断是否会发生下溢
if(s.top != s.base){
s.top--; //先将栈顶指针减 1
e = *(s.top);
}else{
return 0;
}
return e;
}
p = (SDataType *)realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SDataType));
出栈:同样先判断是否为空栈,如果栈空了则返回error。