Push(A)
Push(B)
Pop
Pop
Push(C)
Push(A)
Pop
Push(X)
这会让我最终得到这个线性列表:
X
C
然而,这看起来像一个数组?它是stack = {X,C}还是stack = {C,X}?
根据我的理解,它将是X,C因为堆栈的顶部是头部,而其他一切都是底部(尾部),所以在这种情况下C必须是尾部而X是头部,给我们X,C。然而,在我接受这个之前,我只是认为得到某人的第二意见是明智的,谢谢!
编辑:我记得堆栈是LIFO(后进先出)结构......这让我的事情变得更加复杂。如果'最后一个'是第一个被删除的第一个,按照那个逻辑,数组看起来像C,X不是吗?由于X最后被添加到堆栈中..答案 0 :(得分:2)
它可能是。这将是堆栈的实现细节。您甚至可以使用链接列表实现它,而根本没有数组。
答案 1 :(得分:1)
实现它的一种方法是在向量的末尾添加新条目,并在弹出时从末尾删除它们:
template <typename T>
class MyStack
{
public:
void push(const T& value) { m_stack.push_back(value); }
void pop() { m_stack.pop_back(); }
private:
vector<T> m_stack;
};
假设基础vector
看起来像:[] [] [] [] [] [] []
:
推(A)
[A] [] [] [] [] [] []
推(B)
[A] [B] [] [] [] [] []
Pop
[A] [] [] [] [] [] []
Pop
[] [] [] [] [] [] []
推(C)
[C] [] [] [] [] [] []
推(A)
[C] [A] [] [] [] [] []
Pop
[C] [] [] [] [] [] []
推送(X)
[C] [X] [] [] [] [] []
在vector
的末尾添加和删除通常非常有效。
答案 2 :(得分:1)
让我们看看你的堆栈在每一步看起来如何,让我们尝试可视化数组的外观。为方便起见,数组的第一个条目将是最左边的条目
Push(A) --> [A]
Push(B) --> [B, A]
Pop --> [A]
Pop --> []
Push(C) --> [C]
Push(A) --> [A, C]
Pop --> [C]
Push(X) --> [X, C]
请注意,以这种方式在数组上实现堆栈有点复杂,因为您需要将已存储在数组中的所有先前项目移动到一个位置(每个push
向右移动,向左移动每个pop
)。
我使用的“拇指规则”是:总是堆栈中的第一个项目是将被弹出的项目。在数组中,第一个项目的索引为0
(或1,具体取决于您使用的语言)。
如果你跟踪最后一个条目的索引,那么事情可能会更容易:
Push(A) --> [A] (lastIndex = 0)
Push(B) --> [A, B] (lastIndex = 1)
Pop --> [A] (lastIndex = 0)
Pop --> [] (lastIndex = -1) # Empty stack
Push(C) --> [C] (lastIndex = 0)
Push(A) --> [C, A] (lastIndex = 1)
Pop --> [C] (lastIndex = 0)
Push(X) --> [C, X] (lastIndex = 1)
这是一种更简单的方法......权衡的是你需要将lastIndex
存储在某个地方。