トピック: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;
}