堆栈的头和尾

时间:2013-05-03 20:17:51

标签: list stack push pop

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最后被添加到堆栈中..

3 个答案:

答案 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存储在某个地方。