[算法设计题] 双栈结构

双栈结构

要求

要求编写双栈初始化,判断栈空、栈满、进栈和出栈
已知的双栈结构:

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

算法思想

  1. 两栈共享向量空间,把栈的栈底设置在左右两端,初始时,左栈的栈底等于栈顶等于-1;右栈的栈底等于栈顶等于m;
  2. 两栈的栈顶相邻时栈满(右栈顶-左栈顶 = 1)
  3. 两栈顶相向增长,栈顶指针指向栈顶元素。
  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