共享栈
个人理解:共享顺序栈就是普通顺序栈在存储数组的另一头加上第二个栈顶指针。从而能够更有效地利用存储空间。
而顺序栈与链栈的区别可以参考顺序表和链表的关系。
代码如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h> //共享栈
#define maxsize 20
#define elemtype int
typedef struct{
elemtype data[maxsize];
int top[2];
}SStack;
void InitStack(SStack &S)
{
S.top[0]=-1; //两个栈顶指针分别指向数组头和尾
S.top[1]=maxsize;
}
bool Push(SStack &S,int x,int i)
{
if(S.top[1]-S.top[0]==1)
{
printf("栈已满!请先出栈!");
return false;
}
if(i==0)
{
S.data[++S.top[0]]=x;
return true;
}
else
{
S.data[--S.top[1]]=x;
return true;
}
}
bool Pop(SStack &S,int &x,int i)
{
if(S.top[i]==maxsize||S.top[i]==-1)
{
printf("%d号栈为空!请先入栈!",i);
return false;
}
if(i==0)
{
x=S.data[S.top[0]--];
return true;
}
else
{
x=S.data[S.top[1]++];
return true;
}
}
void main()
{
int a,b,i;
SStack s;
InitStack(s);
bool c;
while(1)
{
printf("请输入您想进行的操作:\n1.入栈\n2.出栈");
scanf("%d",&a);
switch(a)
{
case 1:{
printf("请输入1.压栈元素,2.栈序号(0或1):");
scanf("%d,%d",&b,&i);
c=Push(s,b,i);
if(c)
{
printf("入栈成功!");
}
else printf("入栈失败!"); break;
}
case 2:{
printf("请输入出栈序号(0或1):");
scanf("%d",&i);
c=Pop(s,b,i);
if(c)
{
printf("出栈成功!出栈元素为:%d",b);
}
else printf("出栈失败!");
}
}
}
}
编译结果如下: