两栈共享空间实现

  关键思路:

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;
}

猜你喜欢

转载自blog.csdn.net/zwt0112/article/details/81174990