在一个数组中实现两个栈

17 Mar 2025 | 4 分钟阅读

在这里,我们将创建两个栈,并且只使用一个数组来实现这两个栈,即这两个栈都将使用同一个数组来存储元素。

有两种方法可以使用一个数组来实现两个栈:

第一种方法

首先,我们将数组分成两个子数组。数组将分成两个相等的部分。首先,子数组将被视为栈1,另一个子数组将被视为栈2。

例如,如果我们有一个大小为 n 的数组,n=8。数组将被分成两个相等的部分,即每个大小为 4,如下所示:

Implement two stacks in an array

第一个子数组将是栈1,命名为 st1,第二个子数组将是栈2,命名为 st2。在 st1 上,我们将执行 push1() 和 pop1() 操作,而在 st2 上,我们将执行 push2() 和 pop2() 操作。栈1 的范围是从 0 到 n/2,栈2 的范围是从 n/2 到 n-1。

如果数组大小是奇数。例如,数组的大小为 9,则左子数组的大小为 4,右子数组的大小为 5,如下所示:

Implement two stacks in an array

使用此方法的缺点

即使数组中有空间,也会发生栈溢出条件。在上面的例子中,如果我们正在对栈1 执行 push1() 操作。一旦元素插入到第 3 个索引,如果我们尝试插入更多元素,即使数组中还有剩余空间,也会导致溢出错误。

第二种方法

在这种方法中,我们有一个名为 'a' 的单一数组。在这种情况下,栈1 从 0 开始,而栈2 从 n-1 开始。两个栈都从极端角开始,即栈1 从最左边的角(索引 0)开始,栈2 从最右边的角(索引 n-1)开始。栈1 向右扩展,栈2 向左扩展,如下所示:

如果我们分别将 'a' 推入栈1,将 'q' 推入栈2,如下所示:

Implement two stacks in an array

因此,我们可以说这种方法克服了第一种方法的缺点。在这种情况下,栈溢出条件仅在 top1 + 1 = top2 时发生。这种方法提供了空间高效的实现,这意味着当数组已满时,它才会显示溢出错误。相比之下,第一种方法即使在数组未满时也会显示溢出错误。

C 语言实现

// C 语言程序:使用单个数组实现两个栈并检查溢出和下溢

输出

Implement two stacks in an array