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