栈(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);
}