兩棧共享空間實現

  關鍵思路:

1.兩棧的棧頂指針top1,和top2,分別由數組兩端向中間靠攏,如果top1 + 1 == top2(兩個指針相遇)即爲棧滿的判定條件。

2.棧1爲空時 top1 = -1;  棧2爲空時 top2 = MAXSIZE(即數組的最大長度)。

3.設置判定條件,如果兩個棧頂指針不相遇,則該棧就可以一直使用。

 

實現代碼如下:

#include <stdio.h>

#define MAXSIZE 1024
#define OK 1
#define ERROR 0

// 兩棧共享空間

typedef struct
{
    int data[MAXSIZE];
    int top1;   // 棧1棧頂指針
    int top2;   // 棧2棧頂指針
}SqDoubleStack;

int Push(SqDoubleStack *s, int e, int StackNumber)   // 入棧  StackNumber用來判斷是棧1還是棧2
{
    if(s->top1 + 1 == s->top2)
    {
        printf("棧滿!\n");
        return ERROR;
    }
    if(StackNumber == 1)               // 棧1入棧
    {
        s->data[++s->top1] = e;
    }
    else if(StackNumber == 2)           //棧2入棧
    {
        s->data[--s->top2] = e;
    }
    
    return OK;
}

int Pop(SqDoubleStack *s, int *e, int StackNumber)         // 出棧
{
    if(StackNumber == 1)    // 棧1出棧
    {
        if(s->top1 == -1)
        {
            printf("棧1是空棧!\n");
            return ERROR;
        }
        
        *e = s->data[s->top1--];         //返回棧頂元素 
    }
    else if(StackNumber == 2)
    {
        if(s->top2 == MAXSIZE)
        {
            printf("棧2是空棧!\n");
            return ERROR;
        }
        
        *e = s->data[s->top2++];
    }
    
    return OK;
}
int main()
{
    SqDoubleStack s;
    s.top1 = -1;

 s.top2 = MAXSIZE;
    int i,j,k,y;
    int e;
    
    for(i = 0; i < 10; i++)
    {
        Push(&s, i, 1);               // 棧1入棧
        Push(&s, i, 2);               // 棧2入棧
    }
    printf("棧1:");
    for(k = 0; k < 10; k++)
    {
        Pop(&s, &e, 1);
        
        printf("%d", e);
        
    }
    printf("\n");
    printf("棧2:");
    for(y = 0; y < 10; y++)
    {
        Pop(&s, &e, 2);
        
        printf("%d", e);
        
    }
    printf("\n");
        
    return 0;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章