📅  最后修改于: 2023-12-03 15:23:28.073000             🧑  作者: Mango
在程序设计中,我们有时需要使用多个栈结构,但是空间有限,不能随意增加数组。在这种情况下,我们可以在一个数组中实现两个栈。这种方法可以使数组的利用率更高,达到节省空间的目的。
具体的方法是将数组的两端分别作为两个栈的栈底,栈顶分别向中间移动。
在初始化时,需要确定数组的容量,并分别对两个栈的指针进行初始化,如下所示:
#define MAX_SIZE 100 // 数组的最大容量
struct DoubleStack {
int data[MAX_SIZE];
int top1;
int top2;
};
void init(DoubleStack *ds) {
ds->top1 = -1;
ds->top2 = MAX_SIZE;
}
在压栈时,需要根据栈的编号确定是将数据压入左边的栈还是右边的栈。当两个栈的栈顶指针相遇时,代表数组已经占满,无法继续压栈。
void push(DoubleStack *ds, int which, int x) {
if (ds->top1 + 1 == ds->top2) {
printf("栈已满,无法压入数据\n");
return;
}
if (which == 1) {
ds->data[++ds->top1] = x;
} else if (which == 2) {
ds->data[--ds->top2] = x;
} else {
printf("参数错误\n");
return;
}
}
弹栈时也需要根据栈的编号确定是从左边的栈弹出数据还是从右边的栈弹出数据。当栈为空时,代表无法继续弹出数据。
int pop(DoubleStack *ds, int which) {
if (which == 1) {
if (ds->top1 == -1) {
printf("栈已空,无法弹出数据\n");
return -1;
} else {
return ds->data[ds->top1--];
}
} else if (which == 2) {
if (ds->top2 == MAX_SIZE) {
printf("栈已空,无法弹出数据\n");
return -1;
} else {
return ds->data[ds->top2++];
}
} else {
printf("参数错误\n");
return -1;
}
}
实现两个栈的方法与普通栈的操作类似,唯一的区别在于对压栈和弹栈位置的判断。由于该方法可以节省数组空间,因此在空间有限的情况下可以使用该方法实现多个栈的存储。