题目:将编号0和1的两个栈存放于一个空间V[m]的数组空间中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]=-1时该栈为空;当第1号栈的栈顶指针top[1]=m时,该栈为空。两个栈均从两端向中间增长(如下图)。试编写双栈初始化,判断栈空,栈满,进栈,出栈等算法的函数。
双栈结构的定义如下:
typedef struct{
int top[2],bot[2];//栈顶和栈底指针
SElemType *V;//栈数组
in m;//栈最大可容纳元素的个数(也就是数组长度)
}DblStack;
1.双栈初始化
思路:为双栈空间分配一个大小为m的数组空间。0号栈的栈顶指针和栈底指针的初始值都是-1;1号栈的栈顶指针和栈底指针的初始值都是m。表示栈空。
算法:
Status InitStack(Dblstack &S, int m){
S.V=(SElemType *)malloc(m*sizeof(SElemType)); //为双栈分配一个大小为m的数组空间
if(!S.V){
return ERROR; //存储分配失败
}
S.top[0]=-1;
S.bot[0]=-1;
S.top[1]=m;
S.bot[1]=m;
return OK;
}
2.判断双栈是否为空:
思路:当0号栈的栈顶指针和栈底指针指向同一地址并且1号栈的栈顶指针和栈底指针也指向同一地址时,双栈为空。
算法:
Status DblstackEmpty(Dblstack &S){
if(S.top[0]==S.bot[0]&&S.top[1]==S.bot[1]){
return TRUE; //栈空
}else{
return FALSE; //栈非空
}
}
3.判断双栈是否满
思路:当S.top[0]和S.top[1]相邻即S.top[1]-S.top[0]==1时,表示栈满。
算法:
Status DblstackFull(Dblstack &S){
if(S.top[1]-S.top[0]==1)
return TRUE; //栈满
else
return FALSE; //栈不满
}
4.进栈
思路:首先判断双栈是否满,若满返回ERROR;若不满,将e1存到0号栈的栈顶,e2存到1号栈的栈顶,0号栈的栈顶指针向右移,1号栈的栈顶指针向左移。 (左右移是针对上图)
算法:
Status Push(Dblstack &S,int e1,int e2){
if(DblstackFull(S)){ //调用3中的判满函数
return ERROR; //栈满,无法入栈
}
S.V[++S.top[0]]=e1; //e1存到0号栈栈顶,栈顶元素右移
S.V[--S.top[1]]=e2; //e2存到1号栈栈顶,栈顶元素左移
return OK;
}
5.出栈
思路:首先判断双栈是否为空,若为空,则返回ERROR;若不为空,则将0号栈的栈顶元素的值赋给e1,1号栈的栈顶元素的值赋给e2,0号栈的栈顶指针向左移,1号栈的栈顶元素向右移。(左右移是针对上图)
算法:
Status Pop(Dblstack &S,int e1,int e2){
if(DblstackEmpty(S)){ //调用2中的判空函数
return ERROR; //栈为空,无法出栈
}
e1=S.V[S.top[0]--]; //将0号栈栈顶元素的值赋值给e1,栈顶元素左移
e2=S.V[S.top[1]++]; //将1号栈栈顶元素的值赋值给e2,栈顶元素右移
return OK;
}