同一片连续内存空间中共享的两个栈,高效防止内存浪费
双端栈(也称共享栈)是使用一个连续的一维数组来存储两个单独的栈的设计模式。其核心设计在于让两个栈分别从数组的两端向中间增长:
topA 向右移动(topA++)。topB 向左移动(topB--)。相比于为两个栈分别开辟两个固定长度的数组,双端栈可以实现空间互补。只要两栈的元素总数不超过数组容量 $N$,就不会发生溢出。只有当 topA + 1 == topB 时,才会判定为 栈满溢出(Stack Overflow)。
class DoubleStack {
private:
int* arr; // 共享的一维数组
int capacity; // 数组总容量
int topA; // 栈 A 的栈顶指针,初始为 -1
int topB; // 栈 B 的栈顶指针,初始为 capacity
public:
DoubleStack(int size) {
capacity = size;
arr = new int[capacity];
topA = -1;
topB = capacity;
}
// 压入栈 A
bool pushA(int val) {
if (topA + 1 == topB) {
cout << "Stack Overflow (栈已满冲突)!" << endl;
return false;
}
arr[++topA] = val;
return true;
}
// 压入栈 B
bool pushB(int val) {
if (topA + 1 == topB) {
cout << "Stack Overflow (栈已满冲突)!" << endl;
return false;
}
arr[--topB] = val;
return true;
}
// 弹出栈 A
bool popA(int& val) {
if (topA == -1) {
cout << "Stack A Empty (栈 A 已空)!" << endl;
return false;
}
val = arr[topA--];
return true;
}
// 弹出栈 B
bool popB(int& val) {
if (topB == capacity) {
cout << "Stack B Empty (栈 B 已空)!" << endl;
return false;
}
val = arr[topB++];
return true;
}
};