定義:
利用棧底位置相對不變的特性,可以讓兩個順序棧共享一個一維數組的空間,棧底位於一維數組的兩端,棧頂向共享空間的中間延伸
優勢:
共享棧最大的優勢是節省空間,避免出現“一棧滿,一棧幾乎未用”的情況出現
備註,當然,省空間可以用單鏈表模擬更舒服啦,因爲是隻在一端操作,所以不用擔心存取複雜度的問題啦O(∩_∩)O
操作:
設置兩個棧頂指針,top0 以及 top1 分別代表兩個棧頂,初始值 top0 = 0,top1 = MaxSize ,隨着數據的插入,top0 遞增,top1 遞減,出棧正好相反。當兩個指針相差爲1( top1 - top0 = 1 )時說明棧滿
存取時間複雜度爲 O(1)
下面給出兩個棧s1,s2的共享棧方式
定義:
#define MaxSize 1000
typedef struct
{
int _stack[MaxSize];
int top[2];
}stk;
初始化:
void Init_Stack(stk &s)
{
s.top[0]=-1;
s.top[1]=MaxSize;
}
入棧操作:
bool stack_push(stk &s,int i,int a)
{
if(i<0||i>1) return false; //i代表棧的編號,棧號不對
if(abs(s.top[1]-s.top[0])==1) return false; //棧滿報錯
if(i==0)
{
s._stack[++s.top[i]]=a;
}
else
{
s._stack[--s.top[i]]=a;
}
return true;
}
出棧操作:
bool stack_pop(stk &s,int i,int &e)
{
if(i<0||i>1) return false; //i代表棧的編號,棧號不對
if(i==0)
{
if(s.top[i]<0) return false;
e=s._stack[s.top[i]--];
}
else
{
if(s.top[i]>MaxSize-1) return false;
e=s._stack[s.top[i]++];
}
return true;
}