关于两个相同数据类型的栈共享空间的实现。
具体做法如下图:
最关键就是要如何控制栈顶指针。 如图top1和top2分别是两个栈的栈顶。只要它们两个不见面,那么这个共享栈就可以一直使用。
而栈1为空时,top1=-1,栈2为空时,top2=n。
那么问题来了,什么时候栈满呢? 也就是刚才说的,两个指针见面就是满,那么用代码表示即top1+1=top2
两栈共享空间的结构代码如下:
typedef struct
{
Type data[maxsize];
int top1;//栈1的顶指针
int tpo2;//栈2的顶指针
}SqDoubleStack;
对于两栈共享空间的插入,参数除了要插入的元素数据外,还要加一个判断是进栈1还是栈2的stackNumber
//入栈,参数stackNumber代表入栈1还是栈2
Status Push(SqDoubleStack& Stack, Type e, int stackNumber)
{
//共享栈满足的条件为top1+1=top2
if (Stack.top1 + 1 == Stack.tpo2)
return ERROR;
if (stackNumber == 1)
Stack.data[++Stack.top1] = e;//入栈1,注意这里前置++,先加1再使用
else if (stackNumber == 2)
Stack.data[--Stack.tpo2] = e;//入栈2
return OK;
}
而对于出栈也是同样的需要多加一个stackNumber参数
/出栈,参数stackNumber代表出栈1还是出栈2
Status Pop(SqDoubleStack& Stack, Type e, int stackNumber)
{
if (stackNumber == 1)
{
if (Stack.top1 == -1)//栈1为空,不能出栈
return ERROR;
else
e = Stack.data[Stack.top1--];//注意这里后置--,先使用后-1
}
else if (stackNumber == 2)
{
if (Stack.tpo2 == maxsize)//栈2为空,不能出栈
return ERROR;
else
e = Stack.data[Stack.tpo2--];//注意这里后置--,先使用后-1
}
return OK;
}
这样共享栈基本上就已经完成了,只需稍加修改,就能完成题目要求的将奇数偶数分开。
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#define maxsize 100
#define ERROR 0
#define OK 1
#define TURE 1
#define FALSE 0
typedef int Type;
typedef int Status;
typedef struct
{
Type data[maxsize];
int top1;//栈1的顶指针
int tpo2;//栈2的顶指针
}SqDoubleStack;
//初始化栈
Status InitSqDoubleStack(SqDoubleStack& Stack)
{
Stack.top1 = -1;
Stack.tpo2 = maxsize;
return OK;
}
//入栈,参数stackNumber代表入栈1还是栈2
Status Push(SqDoubleStack& Stack, Type e, int stackNumber)
{
//共享栈满足的条件为top1+1=top2
if (Stack.top1 + 1 == Stack.tpo2)
return ERROR;
if (stackNumber == 1)
Stack.data[++Stack.top1] = e;//入栈1
else if (stackNumber == 2)
Stack.data[--Stack.tpo2] = e;//入栈2
return OK;
}
//出栈,参数stackNumber代表出栈1还是出栈2
Status Pop(SqDoubleStack& Stack, Type e, int stackNumber)
{
if (stackNumber == 1)
{
if (Stack.top1 == -1)
return ERROR;
else
e = Stack.data[Stack.top1--];
}
else if (stackNumber == 2)
{
if (Stack.tpo2 == maxsize)
return ERROR;
else
e = Stack.data[Stack.tpo2--];
}
return OK;
}
//展示2个栈的元素
Status ShowStack(SqDoubleStack& Stack)
{
printf("奇数:");
for (int i = 0; i <= Stack.top1; i++)
printf("%d ", Stack.data[i]);
printf("偶数:");
for (int i = maxsize-1; i >= Stack.tpo2; i--)
printf("%d ", Stack.data[i]);
printf("\n");
return OK;
}
//清空栈元素
Status ClearStack(SqDoubleStack& Stack)
{
Stack.top1 = -1;
Stack.tpo2 = maxsize;
return OK;
}
void menu()
{
int input;
printf("**** 1.开始 0.退出***\n");
printf("请选择->:");
scanf("%d", &input);
}
int main()
{
SqDoubleStack Stack;
int input;
do
{
InitSqDoubleStack(Stack);
printf("这是一个将奇偶数分开的程序\n");
printf("**** 1.开始 0.退出***\n");
printf("请选择->:");
scanf("%d", &input);
if (input == 1)
{
int length,number,flag;
printf("请输入数字个数\n");
scanf("%d", &length);
printf("请输入若干数字:");
for (int i = 0; i < length; i++)
{
scanf("%d", &number);
if (number < 0)
flag = -number;
else
flag = number;
if (flag % 2)
Push(Stack,number,1);
else
Push(Stack,number, 2);
}
ShowStack(Stack);
system("pause");
system("cls");
}
else
printf("输入错误,请重新输入\n");
} while (input);
}
欢迎大家在评论区交流!