数据结构-栈(Ⅳ)
共享栈
- 利用栈底位置相对不变的特性,可让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。
- 共享栈是为了更有效地利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满时才发生上溢。其存取数据的时间复杂度均为O(1),所以对存取效率没有什么影响。
- 栈空条件:栈0空为top0==-1;栈1空为top1==MaxSize。
- 栈满条件:top0==top1-1。
- 元素x进栈操作:进栈=操作为top0++;data[top0]=x;进栈1操作为top1–;data[top1]=x。
- 出栈操作:出栈0操作为x=data[top0];top0–;出栈1操作为x=data[top1];top1++。
- 在上述设置中,data数组表示共享栈的存储空间,top0和top1分别为两个栈的栈顶指针,这样该共享栈通过data、top0和top1来标识,也可以将它们设计为一个结构体类型:
typedef struct
{
ElemType data [Maxsize];
int top0, top1;
}StackType;
- 在实现共享栈的基本运算算法时需要增加一个形参i,指出是对哪个栈进行操作,如i=0表示对栈0进行操作,i=1表示对栈1进行操作。
初始化
void InitStack(StackType& s)
{
s.top0 = -1;
s.top1 = MaxSize;
}
栈判空
bool EmptyStack(StackType s, int i)
{
if (i == 0) return s.top0 == -1;
else return s.top1 == MaxSize;
}
进栈
bool Push(StackType& s, int i, ElemType e)
{
if (i < 0 || i>1)
{
printf("栈号输入不对!");
return false;
}
if (s.top0 + 1 == s.top1) return false;
else
{
if (i == 0) s.data[++s.top0] = e;
else s.data[--s.top1] = e;
}
return true;
}
出栈
bool Pop(StackType& s, int i, ElemType& e)
{
if (i < 0 || i>1)
{
printf("栈号输入不对!");
return false;
}
if (i == 0)
{
if (s.top0 == -1) return false;
else e = s.data[s.top0--];
}
if (i == 1)
{
if (s.top1 == MaxSize) return false;
else e = s.data[s.top1++];
}
return true;
}
完整代码
#include<stdio.h>
#define MaxSize 100
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize];
int top0, top1;
}StackType;
void InitStack(StackType& s)
{
s.top0 = -1;
s.top1 = MaxSize;
}
bool EmptyStack(StackType s, int i)
{
if (i == 0) return s.top0 == -1;
else return s.top1 == MaxSize;
}
bool Push(StackType& s, int i, ElemType e)
{
if (i < 0 || i>1)
{
printf("栈号输入不对!");
return false;
}
if (s.top0 + 0 == s.top1) return false;
else
{
if (i == 0) s.data[++s.top0] = e;
else s.data[--s.top1] = e;
}
return true;
}
bool Pop(StackType& s, int i, ElemType& e)
{
if (i < 0 || i>1)
{
printf("栈号输入不对!");
return false;
}
if (i == 0)
{
if (s.top0 == -1) return false;
else e = s.data[s.top0--];
}
if (i == 1)
{
if (s.top1 == MaxSize) return false;
else e = s.data[s.top1++];
}
return true;
}
void Input(StackType& s)
{
int symbol = 1, stacknum;
ElemType num;
while (symbol)
{
printf("输入0(0号栈)或1(1号栈),或3(退出):\n");
scanf("%d", &num);
if (num == 3) break;
else if (num < 0 || num>1)
{
printf("输入错误!\n");
break;
}
if (num == 0 || num == 1)
{
printf("请输入元素值:\n");
scanf("%d", &stacknum);
if (Push(s, num, stacknum) == 0)
{
printf("栈已满,无法添加!\n");
break;
}
}
}
}
bool DispStack(StackType s, int stacknum)
{
int i;
if (s.top0 == -1 && s.top1 == MaxSize)
{
printf("栈为空\n");
return false;
}
if (stacknum == 0)
{
printf("栈0中的元素为:");
for (i = 0; i <= s.top0; i++)
printf("%d ", s.data[i]);
printf("\n");
printf("栈顶元素为:%d\n", s.data[s.top0]);
}
else if (stacknum == 1)
{
printf("栈1中的元素为:");
for (i = MaxSize - 1; i >= s.top1; i--)
printf("%d ", s.data[i]);
printf("\n");
printf("栈顶元素为:%d\n", s.data[s.top1]);
}
}
int main()
{
StackType s;
InitStack(s);
Input(s);
DispStack(s, 0);
DispStack(s, 1);
printf("共享栈中当前有:%d个元素", MaxSize - (s.top1 - s.top0) + 1);
return 0;
}
程序分析
- 运行结果: