1.栈的基本概念
栈是一种只能在一端进行插入或者删除操作的线性表。其中允许进行插入或者删除的一端成为(TOP),栈顶由一个成为栈顶指针的位置指示器来指示(记录栈顶元素所在结点地址的指针),它是动态变化的。另一端称为栈底,栈底是固定不变的。栈的插入和操作一般称为入栈和出栈。
2.栈的特点
先进先出
3.栈的存储结构
顺序栈和链栈
4.栈的数学性质(稍后会有相关习题)
当n个编号元素以某种顺序进栈,并且可以在任何时刻出栈,所获得的编号元素排列的数目N恰好满足Catalan函数的计算,即
5.顺序栈的基本操作
5.1顺序栈定义
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct{
int *base;
int *top;
int stacksize;
}SqStack;
5.2顺序栈的初始化
int InitStack(SqStack &S)
{
S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(S.base==NULL)
exit(0);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
5.3判断顺序栈是否为空
bool StackEmpty( SqStack S )
{
if(S.top == S.base) return true;
else return false;
}
5.4.求顺序栈的长度
int StackLength( SqStack S )
{
return S.top – S.base;
}
5.5 清空顺序栈
int ClearStack( SqStack S )
{
if( S.base ) S.top = S.base;
return OK;
}
5.6 销毁顺序栈
int DestroyStack( SqStack &S )
{
if( S.base )
{
free(S.base) ;
S.stacksize = 0;
S.base = S.top = NULL;
}
return OK;
}
5.7入栈
int Push ( SqStack &S, int e)
{ //插入元素e为新的栈顶元素
if ( S.top-S.base==S.stacksize ) {
S.base=(SElemType*) realloc ( S.base,
(S.stacksize+STACKINCREMENT)*sizeof (SElemType));
if (!S.base) exit (OVERFLOW);
S.top=S.base + S.stacksize;
S.stacksize+=STACKINCREMENT;
}//超出内存空间,继续追加内存单元
*S.top=e;
S.top++;
//*S.top++ = e;
return OK;
}
5.8出栈
int Pop ( SqStack &S, int & e)
{ //若栈不空,则删除S的栈顶元素,用e返回其值,
并返回OK;否则返回ERROR
if ( S.top == S.base ) return ERROR;
--S.top;
e=*S.top;
//e=*--S.top;
return OK;
}//Pop
5.9 取出栈顶元素
Status GetTop( SqStack S, int &e)
{ // 若栈不空,则用e返回S的栈顶元素
if( S.top == S.base ) return ERROR;
e = *( S.top – 1 );
return OK;
}
6.链栈
类似于链表,栈顶指针就是链表的头指针。且只能在链表头部进行操作。