特点
LIFO后进先出
有顺序栈和链栈两种
3.1顺序栈
3.1.1类型说明
typedef struct {
ElemType elem[Stack_Size];
int top;//栈顶下标
}SeqStack;
top==-1,表示栈空;
top== stacksize-1,表示栈满;
3.1.2初始化
void InitStack ( SeqStack * s )
{
S->top= -1;
}
3.1.3入栈
int Push ( SeqStack *S, ElemType e )
{
S->top++;
S->elem[S->top]=e;
return TRUE;
}
3.1.4出栈
int Pop ( SeqStack *S, ElemType *e )
{
*e=S->elem[S->top];
S->top--;
return TRUE;
}
3.1.5读取栈顶元素
int GetTop ( SeqStack *s, ElemType *e )
{
*e=S->elem[S->top];
return TRUE;
}
3.1.6两栈共享技术
原因:
会因为栈空间大小难以准确估计,产生有的栈溢出,有的栈还很空闲的情况
特点:
栈底位置不变,而栈顶位置动态变化
3.1.6.1定义
#define M 100
typedef struct
{
ElemType Stack[M];//共有栈
int top[2];//两个栈顶指示器
} DqStack;
3.1.6.2初始化
void InitStack ( DqStack *S )
{
S->top[0]=-1;
S->top[1]=M;
}
3.1.6.3入栈
int Push(DqStack *S, ElemType x, int i)
{ if(S->top[0]+1==S->top[1]) return(FALSE); //栈满
switch(i)//选择在哪一侧入栈
{ case 0: S->top[0]++; S->Stack[S->top[0]]=x; break;
case 1: S->top[1]--; S->Stack[S->top[1]]=x; break;
}
return(TRUE);
}
3.1.6.4出栈
int Pop(DqStack *S, ElemType *x, int i)
{ switch(i)
{ case 0: if(S->top[0]==-1) return(FALSE);
*x=S->Stack[S->top[0]]; S->top[0]--; break;
case 1: if(S->top[1]==M) return(FALSE);
*x=S->Stack[S->top[1]]; S->top[1]++; break;
}
return(TRUE);
}