デュアルスタック構造
必須
デュアルスタックの初期化、スタック空、スタックフルの判定、プッシュとポップを記述する必要があります。
既知のデュアルスタック構造:
typedef struct
{
int top[2], bot[2]; //栈顶和栈底指针
SElemType *V; //栈数组
int m; //栈最大可容纳元素
} DblStack;
アルゴリズム思考
- 2 つのスタックはベクトル空間を共有しており、スタックの最下位は左端と右端に設定されています。最初は、左のスタックの最下位はスタックの最上位と等しく -1 に等しく、スタックの最下位はスタックの最上位と等しくなります。右のスタックはスタックの最上位に等しく、m に等しい。
- 2 つのスタックの上部が互いに隣接している場合、スタックはフルになります (右側のスタックの上部 - 左側のスタックの上部 = 1)
- 2 つのスタックの上部は互いに向かって成長し、スタックの上部のポインタはスタックの上部の要素を指します。
- 左側のスタックがプッシュ操作を実行する場合、スタックの最上位要素 (右にシフト) + 1、スタックがポップされる場合、最上位の要素 (左にシフト) - 1。
- 右スタックがプッシュ操作を実行する場合、スタックの最上位要素 (左にシフト) - 1、スタックをポップする場合、最上位の要素 (右にシフト) + 1。
アルゴリズムの実装
- デュアルスタックを初期化する
Status InitStack(DblStack &S, int m){ S.V = new SElemType[m];//初始化数组空间 if(!S.V) return Error; S.bot[0] = -1;//左栈的栈底指针 S.top[0] = -1;//左栈的栈顶指针 S.bot[1] = m;//右栈的栈底指针 S.top[1] = m;//右栈的栈顶指针 return OK; }
- スタックが空であると判断する
int IsEmpty(DblStack S){ return S.top[i] == S.bot[i]; }
- スタックがフルであると判断する
int IsFull(DblStack S) { if (S.top[1] - top[0] == 1) return 1; else return 0; }
- スタック挿入要素を指定します
Status DblPush(DblStack S, int i, SElemType x) { //判断栈满 if (S.top[1] - top[0] == 1) return ERROR; if (i == 0) S.V[++S.top[0]] = x; else S.V[--S.top[1]] = x; return OK; }
- 要素を削除するスタックを指定します
Status DblPop(DblStack &S, int i, SElemType &x) { //判断栈空 if (S.top[i] == S.bot[i]) return ERROR; if (i == 0) x = S.V[S.top[0]--]; else x = S.V[S.top[1]++]; return OK; }