2011-12-20 70 views
1

我一直在用書Practical C++ Programming來評論C++,並且遇到了這些叫Stacks的東西。在書中定義,它被定義爲一種用於存儲數據的算法。什麼是堆棧用於?他們爲什麼使用C++?

從我在書中看到的,它看起來很像裝配......我還記得閱讀關於16位東西的東西。

所以我的問題:什麼是堆棧用於,它們仍然有用,或者它是一種做法,可以更簡單和有效地使用32/64位計算機完成的舊方法?我只是對目標棧的服務感到困惑。


編輯:由於我的問題太模糊了,我會重新解釋它...什麼是堆棧,什麼時候應該使用它。

+3

這是一個數據結構,而不是算法。 – 2011-12-20 16:22:04

+3

這與16/32/64位無關,當你需要某種數據結構時,無論你有多少位,都需要它。 – PlasmaHH 2011-12-20 16:22:43

+1

爲什麼這會受到downvotes攻擊... – Gabe 2011-12-20 16:26:24

回答

6

取決於您正在談論的堆棧。

第一個是內存中的存儲位置。

堆棧是後進先出的數據結構,不管16/32/64位計算機如何,它仍然非常有用。如其他人所說,調用堆棧(或「堆棧」)是堆棧實例的一個例子。

+6

調用堆棧也是先入後出。所以它不是一種不同類型的堆棧 - 它只是堆棧的一個例子。 – sepp2k 2011-12-20 16:23:52

+0

@ sepp2k - 修正。 – 2011-12-20 16:27:15

+1

我是一個屁股,但近100K的貢獻者聲明C經驗應該知道「內存堆棧」是堆棧的應用程序。 – 2011-12-20 16:39:22

2

如果使用標準LIFO邏輯,可以使用堆棧。有很多問題需要LIFO邏輯。

4

本質上,它們用於需要以LIFO(後進先出)方式存儲數據的情況。你可以找到信息here。 在16/32/64 /任何位體系結構上工作與堆棧原理無關。

6

堆棧不是一種方法,而是一種數據結構,在後進先出(LIFO)。

在C++中,std::stack<>是一個類模板,其數據可以是任何類型。在很多情況下,先進先出正是你所需要的。

一個示例是在執行功能/過程期間利用堆棧架構來保存運行狀態的虛擬機或解釋器。考慮這樣子的程序可能無法更改來電的狀態語的翻譯如下:

std::stack<RunState> state; 
Instruction i = fetch(); 

switch (i.type()) { 
case Instruction.Call: 
    state.push (state.top()); 
    break; 
case Instruction.Return: 
    state.pop(); 
    break; 
... 
} 

維基百科有more examples的使用堆棧的數據結構。一些排序問題可以用堆棧相對容易地解決。

與所有的數據結構和C++有相當一些人(listsqueuessetsmaps (a.k.a. associative arrays, a.k.a. dictionaries)arrays/vectors,等等),你可能不需要,現在,甚至沒有在2年,但你應該知道關於它們,它們的性質,優點,劣勢,以及何時適合使用它們。