3.1双栈结构及其基本操作

题目:将编号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;
}

猜你喜欢

转载自blog.csdn.net/qq_39688282/article/details/108059487