栈定义为:只允许在表的一端进行插入和删除的线性表。
允许进行插入和删除的一端叫做栈顶(top),而另一端叫栈底(bottom)。栈中没有任何元素时,称为空栈。设给定栈s=(a0,a1,……,an-1),称a0为栈底,an-1为栈顶。
栈又称作后进先出(LIFO:Last In First Out)的线性表。
栈可以用顺序表实现,称顺序栈(演示);也可以用链表实现,称链栈(演示)。
1 栈的实现的定义
顺序表实现,A为内存当中的堆实现,B为内存当中的栈实现
A:
struct stack
{
ElemType *pBase;
ElemType *pTop;
unsigned int size;
}
B:
struct stack
{
ElemType *pBase;
unsigned int index;
unsigned int size;
}
C:
单链表实现,链表尾部进栈/出栈
2 栈空栈满
A:
判断栈空:s.pBase == s.pTop
判断栈满: s.pTop - s.pBase > STACK_MAX
B:
判断栈空:index == 0
判断栈满: index == STACK_MAX
3 栈有进栈,出栈
A:
出栈:
if(!栈空)
data = *(s.pTop--)
进栈:
if(!栈满)
*(s.pTop++) = data
B:
出栈:
if(!栈空)
data = s[--index]
进栈:
if(!栈满)
s[index++] == data
4 注意栈空间的初始化和释放空间
A 是用内存中的堆空间操作的,适用于复杂的数据类型作为栈的元素
因此需要初始化,使用完后还需要释放栈空间。
初始化:
s.size = STACK_MAX
s.pBase = (ElemType *)malloc(sizeof(ElemType)*s.size)
if(s.pBase)
return OVERFLOW;
s.pBase == s.pTop
B 使用栈内存中空间操作的,无需释放栈空间,但是需要初始化时将index置0
初始化:
index =0;