线性结构------共享栈

时间:2022-06-17
本文章向大家介绍线性结构------共享栈,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

如果一个程序需要使用多个栈,使用顺序栈就会造成栈空间大小难以估计,从而造成有的栈溢出有的栈空闲,此时可以建立一个共享栈,通俗地讲就是将两个栈的栈底设置在同一个数组的两端,栈顶位置用top1、top2表示。如图:

所以共享栈的数据结构类型为:

#include <cstdio>
#define MAX 10
#define INF 0xfffffff
typedef int DataType;

struct DStack
{
	DataType data[MAX];
	int top1;               //top1从数组头部向尾部移动 
	int top2;               //top2从数组尾部向头部移动 
};

基本操作实现:

void InitDStack(DStack &s)
{
	s.top1 = 0;
	s.top2 = MAX - 1;
}

bool isFull(DStack &s)
{
	/*与top的走动方式有关,我这里top1从0开始,
	用top1++,所以判断栈满标志为top2跑到top1前面 */ 
	return s.top1 > s.top2 ? true : false;
}

void Push(DStack &s, DataType e, int tag)
{
	if(isFull(s))
	{
		printf("Full!n");
		return ;		
	}
	if(tag)
		s.data[s.top1++] = e;
	else
		s.data[s.top2--] = e;
}

bool isEmpty(DStack &s, int tag)
{
	if(tag)
		return s.top1 == 0 ? true : false;
	else
		return s.top2 == MAX - 1 ? true : false;
}

DataType Pop(DStack &s, int tag)
{
	if(isEmpty(s, tag))
	{
		printf("Empty!n");
		return INF;
	}
	if(tag)
		return s.data[--s.top1];
	else
		return s.data[++s.top2];
}

测试代码:

int main()
{
	DStack s;
	int t1, t2;
	InitDStack(s);
	
	//测试Push
	 
	for(int i = 0; i < 5; i++)
	{
		Push(s, i, 1); 
		Push(s, 10 - i, 0);
	}
	for(int i = 0; i < 10; i++)
	{
		printf("%d ", s.data[i]);
	}	
	printf("n");
	
	Push(s, 100, 1);
	Push(s, 100, 0);
	
	printf("nn");
	
	//测试Pop
	for(int i = 0; i < 5; i++)
	{
		t1 = Pop(s, 1); 
		t2 = Pop(s, 0);
		printf("t1 = %dnt2 = %dn", t1, t2);
	}
	
	t1 = Pop(s, 1);
	t2 = Pop(s, 0);
	return 0 ;
}