共享棧

定義:

利用棧底位置相對不變的特性,可以讓兩個順序棧共享一個一維數組的空間,棧底位於一維數組的兩端,棧頂向共享空間的中間延伸

優勢:

共享棧最大的優勢是節省空間,避免出現“一棧滿,一棧幾乎未用”的情況出現

備註,當然,省空間可以用單鏈表模擬更舒服啦,因爲是隻在一端操作,所以不用擔心存取複雜度的問題啦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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章