将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空,当第1号栈的栈顶指针top[1]等于m时该栈为空。两个栈均从两端向中间增长(如下图所示) 。
时间: 2025-06-15 09:27:33 浏览: 12
### 在单个数组中实现双端相向增长的两个栈
为了实现在同一个数组内管理两个栈,其中一个栈从左到右生长(称为栈0),另一个栈从右到左生长(称为栈1)。这种设计能够高效利用内存空间,因为当一个栈的空间不足时,只要另一个栈未占满剩余空间,则仍能继续入栈。
#### 栈顶指针初始化条件
对于栈0而言,其栈底位于数组索引`0`处,因此空栈状态下栈顶指针应指向`-1`的位置,表明当前没有任何元素被压入此栈。而对于栈1来说,由于是从右侧开始填充数据项,所以如果整个可用区域大小为`m`,那么空栈状态下的栈顶指针应该设置成等于`m`,意味着第一个实际存放下标的下一个位置[^1]。
```cpp
// 定义双栈类
class TwoStacks {
private:
int* arr; // 数组用于存储两个栈的数据
int top[2]; // 记录两个栈各自的栈顶下标
const int size; // 数组总长度
public:
// 构造函数初始化成员变量并分配动态内存给arr[]
explicit TwoStacks(int s):size(s){
arr = new int[s];
top[0] = -1;
top[1] = s;
}
~TwoStacks(){
delete [] arr;
}
bool push(int stackNum, int value);
int pop(int stackNum);
};
```
上述代码片段展示了如何创建一个名为 `TwoStacks` 的 C++ 类来封装这两个栈的行为逻辑以及它们共享的基础资源——即那个固定大小的一维整型数组 `arr[]` 和用来追踪各自顶部位置的 `top[]` 数组。这里还包含了析构函数以确保程序结束运行之前释放掉所占用的堆上分配出来的那片连续区块。
关于具体的出入栈方法,在执行这些操作前需先判断是否有足够的空间容纳新加入的元素;而出栈动作则要考虑到是否已经到达了该方向上的边界情况:
```cpp
bool TwoStacks::push(int stackNum, int value) {
if (stackNum != 0 && stackNum != 1 || top[0]+1 >= top[1]) return false;
switch(stackNum){
case 0: ++top[0], arr[top[0]] = value;break;
case 1: --top[1], arr[top[1]] = value;break;
}
return true;
}
int TwoStacks::pop(int stackNum) {
if ((stackNum == 0 && top[0]==-1)||(stackNum==1&&top[1]==size)) throw std::out_of_range("Pop from empty stack");
int retValue=0;
switch(stackNum){
case 0:retValue=arr[top[0]],--top[0];break;
case 1:retValue=arr[top[1]],++top[1];break;
}
return retValue;
}
```
这段实现了基本的功能接口:`push()` 方法负责将指定数值按序号推入相应编号的栈里,并更新对应栈顶指标;而 `pop()` 则相反地移除最上面的那个项目再调整回退一格。注意这里的异常处理机制是为了防止非法访问越界带来的潜在风险。
阅读全文
相关推荐














