两栈共享
两栈共享是一种数据结构的使用方式。
一、概念
两栈共享是指在一个连续的存储区域中同时存放两个栈。这两个栈分别从存储区域的两端开始向中间生长,通过合理的设计和管理,可以有效地利用存储空间,避免了为两个独立的栈分别分配空间可能导致的空间浪费。
二、实现方式
空间分配
通常将一个连续的存储区域划分为两部分,一部分用于第一个栈,从存储区域的一端开始;另一部分用于第二个栈,从存储区域的另一端开始。
例如,可以使用一个数组来实现两栈共享,数组的一端作为一个栈的栈底,另一端作为另一个栈的栈底。
入栈操作
对于第一个栈,入栈操作是在存储区域的一端进行,将新元素放在当前栈顶位置,并将栈顶指针向上移动一位。
对于第二个栈,入栈操作是在存储区域的另一端进行,将新元素放在当前栈顶位置,并将栈顶指针向下移动一位。
出栈操作
三、优点
空间利用率高
由于两个栈共享同一个存储区域,可以根据实际需求动态地分配空间,避免了为每个栈单独分配固定大小的空间可能导致的空间浪费。
特别是在栈的大小不确定或者两个栈的使用情况不均衡时,两栈共享可以更好地利用存储空间。
操作简单
示例代码如下:
class TwoStacksInOneArray {
private int[] array;
private int top1;
private int top2;
public TwoStacksInOneArray(int size) {
array = new int[size];
top1 = -1;
top2 = size;
}
public void push1(int value) {
if (top1 + 1 == top2) {
System.out.println("Stack overflow");
} else {
array[++top1] = value;
}
}
public void push2(int value) {
if (top2 - 1 == top1) {
System.out.println("Stack overflow");
} else {
array[--top2] = value;
}
}
public int pop1() {
if (top1 == -1) {
System.out.println("Stack 1 is empty");
return -1;
} else {
return array[top1--];
}
}
public int pop2() {
if (top2 == array.length) {
System.out.println("Stack 2 is empty");
return -1;
} else {
return array[top2++];
}
}
}
public class TwoStacksSharedExample {
public static void main(String[] args) {
TwoStacksInOneArray stacks = new TwoStacksInOneArray(5);
stacks.push1(1);
stacks.push1(2);
stacks.push2(3);
stacks.push2(4);
System.out.println("Popped from stack 1: " + stacks.pop1());
System.out.println("Popped from stack 2: " + stacks.pop2());
}
}