C语言实现两栈共享空间

309 阅读2分钟

题目: 设计两个栈 S1、S2 都采用顺序栈方式,并且共享一个存储区[0,MaxLen-1], 为了尽量利用空间,减少溢出的可能,可采用栈顶相向、迎面增长的存储方式,如下图 1所示。设计一个有关栈的入栈和出栈算法

图1

分析: 两栈共享存储空间,需要解决的关键问题在于如何判断栈满和栈空,由于 两栈共享存储空间,入栈和出栈的时候还需要区分是哪个栈。

设 lsTop 是左栈(数组 下标为 0 的一端为栈底)栈顶指针,rsTop 为右栈(数组下标为 MaxLen-1 的一端为栈 底)栈顶指针。

显然,当两个栈都为空时,lsTop==-1,rsTop==MaxLen,如图2所 示;当栈满时,rsTop 和 lsTop 存在以下关系:rsTop==lsTop+1,如下图3 所示。

图2

图3

伪代码实现:

一、入栈

操作接口:void Push(int i, DataType x);
1. 如果栈满,则抛出上溢异常;
2. 判断是插在栈1还是栈2;
    2.1 若在栈1插入,则
        2.1.1 top1加1;
        2.1.2 在top1处填入数据x;
    2.2 若插在栈2,则
        2.2.1 top2减1;
        2.2.2 在top2处填入数据x;

二、出栈

操作接口:DataType Pop(int i);
1. 若是在栈1删除,则
    1.1 若栈1为空栈,抛出下溢异常;
    1.2 删除并返回栈1的栈顶元素;
2. 若是在栈2删除,则
    2.1 若栈2为空栈,抛出下溢异常;
    2.2 删除并返回栈2的栈顶元素;

代码实现:

一、入栈

入栈,s=1,入左栈,s=2,入右栈,x 为入栈元素
void push(int s,int x)
{
    if(rsTop == lsTop+1)//栈满
    {
        printf("栈已满!\n");
        return;
    }
    if(s==1)//入左栈
    {
        dsStack[lsTop++] = x;
    }
    else if(s == 2)//入右栈
    {
        dsStack[rsTop--] = x;
    }
    else
    printf("该栈不存在!\n");
    return;
}

二、出栈

int pop(int s,int *x)
{
    if(s==1)//出左栈
    {
        if(lsTop == -1)
        {
            printf("栈已空!\n");
            return 0;
        }
        *x = dsStack[lsTop--];   
    }
    else if(s == 2)//出右栈
    {
        if(rsTop == MaxLen)
        {
            printf("栈已空!\n");
             return 0;
        }
        *x = dsStack[rsTop++];
     }
    else
    {
        printf("该栈不存在!\n");
        return 0;
    }
    return 1;
 }