LinkStack
文章目錄
- 1 LinkStack的實(shí)現(xiàn)
- 1.1 StaticStack的缺陷
- 1.2 鏈?zhǔn)綏5拇鎯?chǔ)實(shí)現(xiàn)
- 1.3 鏈?zhǔn)綏5脑O(shè)計(jì)要點(diǎn)
- 1.4 繼承關(guān)系圖
- 2 代碼實(shí)現(xiàn)
- 3 棧的應(yīng)用實(shí)踐
- 4 小結(jié)
1 LinkStack的實(shí)現(xiàn)
1.1 StaticStack的缺陷
由于StaticStack內(nèi)部使用了原聲數(shù)組,當(dāng)存儲(chǔ)的元素為類類型時(shí),StaticStack的對(duì)象在創(chuàng)建時(shí),會(huì)多次調(diào)用元素類型的構(gòu)造函數(shù),影響效率。因此,我們需要鏈?zhǔn)綏肀苊膺@種缺陷。
1.2 鏈?zhǔn)綏5拇鎯?chǔ)實(shí)現(xiàn)
1.3 鏈?zhǔn)綏5脑O(shè)計(jì)要點(diǎn)
- 類模板,抽象父類Stack的直接子類。
- 在內(nèi)部組合使用LinkList類,實(shí)現(xiàn)棧的鏈?zhǔn)酱鎯?chǔ)。
- 只在單鏈表成員對(duì)象的頭部進(jìn)行操作。
1.4 繼承關(guān)系圖
2 代碼實(shí)現(xiàn)
#ifndef LINKSTACK_H #define LINKSTACK_H#include "Stack.h" #include "LinkList.h" #include "Exception.h"namespace LemonLib { template <typename T> class LinkStack : Stack<T> { protected:LinkList<T> m_list;public:void push(const T& e){m_list.insert(0, e);}void pop(){if (m_list.length() > 0){m_list.remove(0);}else{THROW_EXCEPTION(InvalidOperationException, "No element in current stack ...");}}T top() const{if (m_list.length() > 0){return m_list.get(0);}else{THROW_EXCEPTION(InvalidOperationException, "No element in current stack ...");}}void clear(){m_list.clear();}int size() const{return m_list.length();} }; }#endif // LINKSTACK_H3 棧的應(yīng)用實(shí)踐
符號(hào)匹配問題:
在C語言中有一些成對(duì)匹配出現(xiàn)的符號(hào):
- 括號(hào):(),[],{},<>
- 引號(hào):’’,""
那么我們?nèi)绾螌?shí)現(xiàn)編譯器中的符號(hào)成對(duì)檢測(cè)呢?
算法思路:
-
從第一個(gè)字符開始掃描
- 當(dāng)遇見普通字符時(shí)忽略
- 當(dāng)遇見左符號(hào)時(shí)壓入棧中
- 當(dāng)遇見右符號(hào)時(shí)彈出棧頂符號(hào),并進(jìn)行匹配
-
結(jié)束
- 成功:所有字符掃描完畢,并且棧為空
- 失敗:匹配失敗或所有字符掃描完畢但棧非空
4 小結(jié)
- 鏈?zhǔn)綏5膶?shí)現(xiàn)組合使用了單鏈表對(duì)象。
- 在單鏈表的頭部進(jìn)行操作能夠?qū)崿F(xiàn)高效的入棧和出棧操作。
- 棧“后近先出”的特性適用于檢測(cè)成對(duì)出現(xiàn)的符號(hào)。
- 棧非常適合于需要“就近匹配”的場(chǎng)合。
總結(jié)
- 上一篇: StaticStack
- 下一篇: StaticQueue