本题两个栈共享空间,将两个栈的栈底设在共享栈的两端,两个栈的栈顶指针都指向栈顶元素,top0=-1时0号栈为空,top1=max时1号栈为空;仅当两个栈顶指针相邻为(top1-top0=1)时,判断为栈满。当0号栈进栈时,top0先加1再赋值,1号栈进栈时top1先减1再赋值;出栈时刚好相反。
共享栈是为了更有效的利用存储空间,两个栈的空间相互调节,只有在整个存储空间都被占满时才会发生上溢。
入栈操作为
int push(int i, int x)
{
if (i != 0 && i != 1)
{
printf("\n无栈");
return -1;
}
if (s.top[1] - s.top[0] == Max - 1)
{
printf("\n栈满");
return -1;
}
if (i == 0)
{
s.data[++s.top[0]] = x;
}
else
s.data[--s.top[1]] = x;
return 1;
}
出栈代码如下
int pop(int i)
{
if (i != 0 && i != 1)
{
printf("\n无栈");
return -1; //在错误情况下返回-1
}
if (i == 0)
{
if (s.top[0] == -1)
{
printf("\n0号栈空");
return -1; //在错误情况下返回-1
}
return s.data[s.top[0]--];
}
else
{
if (s.top[1] == Max)
{
printf("\n1号栈空");
return -1; //在错误情况下返回-1
}
return s.data[s.top[1]++];
}
}
完整测试代码
#include<stdio.h>
#include<stdlib.h>
#define Max 50
typedef struct
{
int data[Max];
int top[2];
}stack;
stack s;
int push(int i, int x)
{
if (i != 0 && i != 1)
{
printf("\n无栈");
return -1;
}
if (s.top[1] - s.top[0] == Max - 1)
{
printf("\n栈满");
return -1;
}
if (i == 0)
{
s.data[++s.top[0]] = x;
}
else
s.data[--s.top[1]] = x;
return 1;
}
int pop(int i)
{
if (i != 0 && i != 1)
{
printf("\n无栈");
return -1; //在错误情况下返回-1
}
if (i == 0)
{
if (s.top[0] == -1)
{
printf("\n0号栈空");
return -1; //在错误情况下返回-1
}
return s.data[s.top[0]--];
}
else
{
if (s.top[1] == Max)
{
printf("\n1号栈空");
return -1; //在错误情况下返回-1
}
return s.data[s.top[1]++];
}
}
int main()
{
s.top[0] = -1, s.top[1] = Max;
if (push(0, 1) != -1) //检查push函数的返回值
{
printf("0号栈进栈成功");
}
int x = pop(0); //检查pop函数的返回值
if (x != -1) //只有在pop函数成功时才打印出栈元素
{
printf("\n0号栈出栈成功");
printf(" 0号栈出栈元素为:%d", x); //修正此处,用%d来打印整数
}
int y = pop(0); //检查pop函数的返回值
return 0;
}