2013-05-03 83 views
0
Push(A) 
Push(B) 
Pop 
Pop 
Push(C) 
Push(A) 
Pop 
Push(X) 

这将导致我这个线性表结束的:头和尾堆栈

X

Ç

然而,这将如何看作为一个数组?它会是stack = {X,C}还是stack = {C,X}?

据我的理解,它会是X,C,因为堆栈顶部是头部,其他所有部分都是底部(尾部),所以在这种情况下,C必须是尾部,X是头部,我们X,C。然而,在我接受这个之前,我只是认为明智地获得第二个人的意见,谢谢!

编辑:我只记得,堆栈是LIFO(后进先出)结构...这只是做的事情对我来说更加复杂。如果'最后一个'是第一个被首先移除的,那么按照这个逻辑,数组看起来像C,X不是?由于X加入到堆栈中最后..

回答

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] [] [] [] [] [] 

流行

[A] [] [] [] [] [] [] 

流行

[] [] [] [] [] [] [] 

推送(C)

[C] [] [] [] [] [] [] 

推送(A)

[C] [A] [] [] [] [] [] 

流行

[C] [] [] [] [] [] [] 

推送(X)

[C] [X] [] [] [] [] [] 

添加到和从一个vector的端部上除去一般是相当有效的。

2

它可以是。这将是堆栈的实现细节。你甚至可以使用链表来实现它,并且根本没有数组。

+0

嗯,我看到了,我只是担心这会在考试中出现的可能性,它迫使我选择X,C或C,X – JimmyK 2013-05-03 20:46:18

+0

@JimmyK如果你担心它,我会和你谈谈老师,看看他们说什么。我希望他们能够足够聪明地认识到任何一种答案都是可以接受的,但我知道有时并非如此。 – Becuzz 2013-05-06 14:30:37

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