数据结构之栈(2)——多栈共享技术

 多栈共享技术的应用:经常会发生一个程序使用多个栈的情况,然而若使用顺序栈,因为难以对每个栈的空间准确估计,所以会发生有的栈已经溢出,有的栈却还很空闲的状况,解决方案是:可以让多个栈共享一个足够大的数组空间,通过利用栈的动态特性来使其存储空间相互补充,这就是多栈的共享技术

双端栈

 

首先申请一个共享的一位数组空间S[M],将两个栈的栈底分别放在数组的两端,即:0,M-1栈顶动态变化,从而多栈共享,提高空间利用率

双端栈的定义

typedef char ElemType;
typedef struct{
	ElemType elem[M];
	int top[2];
}ShareStack;

 定义一个较大数组存放数据,下标用来表示他们在栈中的位子,定义一个较小数组(长度为2)分别存放两个栈顶位置

 

双端栈的初始化

//初始化 
void Init(ShareStack *s)
{
	s->top[0]=-1;
	s->top[1]=M;
}

 -1和M分别赋空

 

 

双端栈的入栈操作

//入栈:i表示栈号 
bool PushStack(ShareStack *s,ElemType x,int i)
{
	if(s->top[0]+1==s->top[1])
		return false;
	else
	{
		switch(i)
		{
			case 0:
				s->top[0]++;
				s->elem[s->top[0]]=x;
				break;
			case 1:
				s->top[1]--;
				s->elem[s->top[1]]=x;	
				break;
			default:
				return false;
		}
	}
		return true;
}

先判断栈是否已满,若未满,根据i值(栈号)记住,先更改栈顶指示器top,在进行赋值操作  

 

双端栈的出栈

bool PopStack(ShareStack *s,ElemType x,int i)
{
    switch(i)
    {
        case 0:
            if(s->top[0]==-1)
            return false;
            else
            {
                x=s->elem[s->top[0]];
                s->top[0]--;
                break;
            }
        case 1:
            if(s->top[1]==M)
            return false;
            else
            {
                x=s->elem[s->top[1]];
                s->top[1]++ ;
                break;
            }
            default:
            return false;
    }    
    return true;
}

 

先根据i值(栈号),判断入哪一个栈,再分别判断栈是否为空,若未空,则先赋值,后更改top

 

posted @ 2016-04-05 22:21  LT.C#  阅读(1190)  评论(0编辑  收藏  举报