3.1デュアルスタック構造とその基本操作

トピック:0と1の番号が付けられた2つのスタックをスペースV [m]の配列スペースに格納し、スタックの最下部は配列の両端にあります。No.0スタックのトップポインタtop [0]が-1の場合、スタックは空です。No.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の最上位要素の値をスタック1の最上位要素の値であるe1に割り当てます。値は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