【アルゴリズム設計問題】デュアルスタック構造

デュアルスタック構造

必須

デュアルスタックの初期化、スタック空、スタックフルの判定、プッシュとポップを記述する必要があります。
既知のデュアルスタック構造:

typedef struct
{
    
    
	int top[2], bot[2]; //栈顶和栈底指针
	SElemType *V;		//栈数组
	int m;				//栈最大可容纳元素
} DblStack;

アルゴリズム思考

  1. 2 つのスタックはベクトル空間を共有しており、スタックの最下位は左端と右端に設定されています。最初は、左のスタックの最下位はスタックの最上位と等しく -1 に等しく、スタックの最下位はスタックの最上位と等しくなります。右のスタックはスタックの最上位に等しく、m に等しい。
  2. 2 つのスタックの上部が互いに隣接している場合、スタックはフルになります (右側のスタックの上部 - 左側のスタックの上部 = 1)
  3. 2 つのスタックの上部は互いに向かって成長し、スタックの上部のポインタはスタックの上部の要素を指します。
  4. 左側のスタックがプッシュ操作を実行する場合、スタックの最上位要素 (右にシフト) + 1、スタックがポップされる場合、最上位の要素 (左にシフト) - 1。
  5. 右スタックがプッシュ操作を実行する場合、スタックの最上位要素 (左にシフト) - 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;
    }
    
  2. スタックが空であると判断する
    int IsEmpty(DblStack S){
          
          
    	return S.top[i] == S.bot[i];
    }
    
  3. スタックがフルであると判断する
    int IsFull(DblStack S)	{
          
          
    	if (S.top[1] - top[0] == 1) return 1;
    	else return 0;
    }
    
  4. スタック挿入要素を指定します
    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;
    }
    
  5. 要素を削除するスタックを指定します
    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;
    }
    

おすすめ

転載: blog.csdn.net/qq_43216714/article/details/123780833