7 6 棧與佇列 棧的基本操作和應用

2021-07-13 11:29:03 字數 1256 閱讀 2145

棧和佇列都是特殊的線性表,是限制訪問位置的線性結構;可以由順序表實現,也可以由鍊錶實現。棧定義為:

只允許在表的一端進行插入和刪除的線性表

。允許進行插入和刪除的一端叫做

棧頂(top),而另一端叫

棧底(bottom)。棧中沒有任何元素時,稱為

空棧。設給定棧s=(a0,a1,……,an-1),稱a0為棧底,an-1為棧頂。

棧又稱作

後進先出

(lifo:last in first out)的線性表。

棧可以用順序表實現,稱

順序棧(

檢視動畫演示

);也可以用鍊錶實現,稱鏈棧(

檢視動畫演示

)。templateclass stack

void push(const t &data); //壓棧

t pop(); //彈出,top--,出棧

t getelem(int i); //取第i個資料,top不變

void printstack(); /*輸出棧內所有資料*/

void makeempty()//清空棧

bool isempty() const//判斷棧空

bool isfull() const

};順序棧類模板中的成員函式的**參見【

例7.8

】。綜合單鏈表和棧可知:首先定義鏈棧的

節點類模板

,然後在節點類基礎上定義

鏈棧類模板

。詳細**參見【

例7.9_h

】。順序棧和鏈棧邏輯功能是一樣,儘管這裡兩個棧模板的成員函式功能選擇稍有出入,因為順序棧可以隨機訪問其中的元素,而鏈棧只能順序訪問,但邏輯上完全可以做到一樣(物理結構不同)。

順序棧必須先開一定大小記憶體空間,執行起來簡單,速度快,可能溢位。鏈棧記憶體空間隨用隨開,不會溢位,但執行複雜(不斷地動態分配),速度慢。 棧可用於表示式的計算。

現考慮最簡單的+、-、*、/四個運算子和結束符=組成的算術表示式,只有兩個優先順序,先*/,後+-。設有:a+b*c-d/e=。 為實現運算子的優先順序,採用兩個棧:乙個數棧,乙個運算子棧。數棧暫存運算元,運算子棧暫存運算子。從左向右掃瞄算術表示式,遇到運算元,壓入數棧;遇到運算子,則與運算子棧棧頂的運算子比較優先順序,若新的運算子優先順序高,或運算子棧空,則壓棧。否則將棧頂運算子出棧,與數字棧出棧的兩個資料進行運算,結果壓入數棧,再將新運算子壓棧。繼續掃瞄,直到遇到=號,掃瞄結束。棧中資料繼續按前面規則出棧。(

檢視動畫演示

)詳細**請參見【

例7.9

】。

棧與佇列基本操作

想了下,上學期學的資料結構線性結構還有些混亂的地方,想做一點注意事項的總結。1.鍊錶 2.棧順序棧 定義乙個陣列 可以是陣列形式的data 或指標形式的 data,若是指標形式就 需要在結構體中加乙個變數maxsize存放陣列的最大容量 和棧頂指標 在順序棧中就是 陣列下標 棧頂指標存放棧頂元素,初...

棧與佇列基本操作

include include typedef struct lnodelnode,linklist 頭插法 linklist create list head int n return head 尾插法 linklist create list tail int n else tail next ...

棧和佇列的基本操作

看歐立奇的 程式設計師面試寶典 的棧和佇列的部分,發現了部分問題。其中棧的部分,不能簡單的用malloc函式來初始化stack,應該呼叫create 函式 而且棧的base應該指向棧的最下面的資料的下乙個位址。全部除錯通過 棧的部分通過單鏈表來實現鏈棧的結構 include using namesp...