栈-两栈共享空间

栈(stack)-两栈共享空间

将两个数组看做成两个栈,这两个栈有两个栈底,将两个数组结合起来,第一个数组的头和第二个数组的尾相连。

在这里插入图片描述空栈情况:top1 = -1, top2 = n;

进栈,top1向右移动,top2向左移动
出栈,top1向左移动,top2向右移动

栈结构

const int MAXSIZE = 10;
typedef int ElemType;
//两栈共享空间的顺序储存结构
typedef struct _DoubleNode{
	ElemType data[MAXSIZE];
	int top1 = -1;		//栈1的栈顶指针   默认值
	int top2 = MAXSIZE;	//栈2的栈顶指针	  默认值
}DoubleNode;

初始化栈

代码如下:

//初始化节点
/初始化栈   初始化的栈node  栈1中初始化元素的个数
void createDoubleStack(DoubleNode *node, int n1, int n2)
{
	if (n1 > MAXSIZE || n2 > MAXSIZE || n1 < 0 || n2 < 0 || ((n1 + n2) > MAXSIZE))
	{
		cout << "报错" << endl;
		return;
	}
	for (int i = 1; i <= n1; i++)
	{
		node->top1++;//栈1顶指针自加
		node->data[node->top1] = i;
	}
	for (int i = 1; i <= n2; i++)
	{
		node->top2--;//栈2顶指针自减
		node->data[node->top2] = i + 10;
	}
}

进栈

代码如下:

//插入节点--进栈      
void pushDoubleStack(DoubleNode *node, ElemType e, int n)
{
	if ((node->top1 + 1) == node->top2)//栈满的情况
	{
		cout << "报错" << endl;
		return;
	}
	if (n == 1)
	{
		node->top1++;//栈1顶指针移动
		node->data[node->top1] = e;
	}
	else if (n == 2)
	{
		node->top2--;//栈2顶指针移动
		node->data[node->top2] = e;
	}
	else//输入n不为1和2情况
	{
		cout << "报错" << endl;
		return;
	}
}

出栈

代码如下:

//删除节点--出栈
void popDoubleStack(DoubleNode *node, ElemType* e, int n)
{
	if (node->top1 == -1)//栈空的情况
	{
		cout << "报错" << endl;
		return;
	}
	if (n == 1)
	{
		*e = node->data[node->top1];	//获得删除的值
		node->data[node->top1] = 0;		//节点值清零
		node->top1--;
	}
	else if (n == 2)
	{
		*e = node->data[node->top2];	//获得删除的值
		node->data[node->top2] = 0;		//节点值清零
		node->top2++;
	}
	else
	{
		cout << "报错" << endl;
		return;
	}
}

打印栈

//打印栈
void printDoubleStack(DoubleNode *node)
{//分块打印   分别打印栈1、栈2  都是从栈底开始打印
	for (int i = 0; i <= node->top1; i++)
	{
		cout << node->data[i] << endl;
	}
	for (int i = MAXSIZE - 1; i >= node->top2; i--)
	{
		cout << node->data[i] << endl;
	}
}

main函数测试

int main()
{
	DoubleNode *node = new DoubleNode();
	//初始化栈
	createDoubleStack(node, 3, 2);

	//插入节点--进栈
	pushDoubleStack(node, 66, 1);
	pushDoubleStack(node, 88, 2);

	int num1, num2; 
	//删除节点--出栈
	popDoubleStack(node, &num1, 1);
	popDoubleStack(node, &num2, 2);
	cout << num1 << " " << num2 << endl;
	cout << endl;

	//打印栈
	printDoubleStack(node);
}

猜你喜欢

转载自blog.csdn.net/weixin_43340991/article/details/86375829