数据结构—共享栈

数据结构-栈(Ⅳ)

共享栈

  • 利用栈底位置相对不变的特性,可让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。
    在这里插入图片描述
  • 共享栈是为了更有效地利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满时才发生上溢。其存取数据的时间复杂度均为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; //栈s1空
		else e = s.data[s.top0--];
	}
	if (i == 1)
	{
		if (s.top1 == MaxSize) return false; //栈s2空
		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; //栈s1空
		else e = s.data[s.top0--];
	}
	if (i == 1)
	{
		if (s.top1 == MaxSize) return false; //栈s2空
		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;
}

程序分析

  • 运行结果:
    在这里插入图片描述
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值