容器介面卡(棧容器介面卡、佇列容器介面卡)
阿新 • • 發佈:2018-10-31
我們已有的容器(比如vector、list),這個容器支援的操作很多,比如插入,刪除,迭代器訪問等等。而我們希望這個容器表現出來的是棧的樣子:先進後出,入棧出棧等等,
此時,我們沒有必要重新動手寫一個新的資料結構,而是把原來的容器重新封裝一下,改變它的介面,就能把它當做棧使用了。
c++定義了三種容器介面卡,他們讓容器提供的介面變成了我們常用的資料結構:棧(先進後出),佇列(先進先出),優先順序佇列。
對於棧來說,主要操作包括:出棧,進棧,棧裡元素個數,棧是否為空,棧頂元素;
對於佇列來說,主要操作包括:進隊,出隊,隊裡元素個數,隊是否為空,隊頭元素。
注:下面程式碼所用的順序表和連結串列相關程式碼再這篇部落格中:
https://blog.csdn.net/sophia__yu/article/details/82993934
接下來將會把棧和佇列的容器設配器程式碼展開:
棧容器介面卡
#pragma once #include"List.h" #include"Seqlist.h" template<class T,class Container=Seqlist<T>> //預設引數 對於棧來說,介面卡預設是順序表 //Container就是介面卡,container是一個模板形參,模板實參傳的是什麼型別,Container就是什麼型別 class Stack { public: void Push(const T& data) //進棧 { _con.PushBack(data); } void Pop() //出棧 { _con.PopBack(); } size_t Size() { return _con.Size(); } bool Empty() { return _con.Empty(); } T& Top() //返回棧頂元素 { return _con.Top(); } private: Container _con; }; void TestStackCon() { Stack<int, Seqlist<int> >s1; s1.Push(1); s1.Push(2); s1.Push(3); cout << s1.Top() << endl; s1.Pop(); cout << s1.Top() << endl; cout << s1.Size() << endl; Stack<string, Seqlist<string>>s2; s2.Push("pick"); s2.Push("mh"); cout << s2.Top() << endl; s2.Pop(); cout << s2.Top() << endl; //Stack<int, Seqlist<char>>s4; //s4.Push(4); //cout << s4.Top() << endl; //出錯 Stack<int, List<int>>s5; s5.Push(10); s5.Push(11); s5.Push(13); s5.Push(14); cout << s5.Top() << endl; cout << s5.Size() << endl; }
佇列容器介面卡
#pragma once #include"List.h" #include"Seqlist.h" //佇列容器介面卡 //佇列先進先出 template<class T, class Container> class Queue { public: void Push(const T& data) //進隊 { _con.PushBack(data); } void Pop() //出隊 { _con.PopFront(); } size_t Size() { return _con.Size(); } bool Empty() { return _con.Empty(); } T& Front() //隊頭元素 { return _con.Front(); } private: Container _con; }; void TestQueueCon() { Queue<int, Seqlist<int>> q1; q1.Push(10); q1.Push(11); q1.Push(12); q1.Push(13); cout << q1.Front() << endl; q1.Pop(); cout << q1.Front() << endl; cout << q1.Size() << endl; }
有了容器介面卡,棧和佇列就可以用順序表和連結串列來做模板引數進行操作。