/*
1.利用两个栈sl,s2共用一段顺序存储空间
2.用栈的运算实现栈的插入,删除,判满以及判空运算
3.验证如下示例:
1)顺序存储空间大小为:5;
2)S1分别入栈1,2,3,4,5共5个元素;
3)S2入栈元素6,会有栈满提示;
4)S1出栈一个元素,S2再次入栈元素6 ;
5)打印顺序存储空间中所有元素 ;
6)S2连续出栈两次,会有栈空提示
*/
#include <stdio.h>
#include <malloc.h>
#define MaxSize 5
typedef int ElementType;
typedef struct {
ElementType data[MaxSize];
int top1;
int top2;
} SqStack;
//新建共享栈
SqStack * CreateStack( )
{ SqStack* S=(SqStack*)malloc(sizeof(SqStack));
S->top1=-1;
S->top2=MaxSize;
return S;
}
//判断共享栈否为满,是返回1,否返回0
int IsFull(SqStack *s)
{
if(s->top2-s->top1==1)
return 1;
else
return 0;
}
//判断共享栈是否为空,是返回1,否返回0
int IsEmpty(SqStack * s)
{
if(s->top1==-1&&s->top2==MaxSize)
return 1;
else
return 0;
}
//压栈操作 tag为1表示压入栈1,tag为2表示压入栈2
void Push( SqStack *s, ElementType x,int tag )
{
if(IsFull(s))
printf("栈满!\n");
else{
if(tag==1)
s->data[++s->top1]=x;
if(tag==2)
s->data[--s->top2]=x;
}
}
//出栈操作
ElementType Pop( SqStack *s,int tag)
{
if(IsEmpty(s))
printf("栈空!\n");
else{
if(tag==1)
if(s->top1==-1)
printf("S1栈空!\n");
else
s->top1--;
if(tag==2)
if(s->top2==MaxSize)
printf("S2栈空!\n");
else
s->top2++;
}
}
int main()
{
/*---------------1、新建栈1)顺序存储空间大小为:5 ----------------*/
SqStack * s=CreateStack();
/*--------------2)S1分别入栈1,2,3,4,5共5个元素;---------------*/
for(int i=1;i<=5;i++)
Push(s,i,1);
/*--------------3)S2入栈元素6,会有栈满提示;---------------*/
Push(s,6,2);
/*--------------4)S1出栈一个元素,S2再次入栈元素6 ;---------------*/
Pop(s,1);Push(s,6,2);
/*--------------5)打印顺序存储空间中所有元素---------------*/
for(int i=0;i<=s->top1;i++)
printf("%4d",s->data[i]);
for(int i=s->top2;i<MaxSize;i++)
printf("%4d",s->data[i]);
/*---------------6)S2连续出栈两次,会有栈空提示---------*/
printf("\n");
Pop(s,2);
Pop(s,2);
}