封裝一個棧,佇列
阿新 • • 發佈:2018-12-20
一、棧:
特殊的線性表,只能在其一端進行資料插入和刪除操作,
特性:先進後出 FIFO
2、模擬實現一個棧
# include<stdio.h> # include<stdlib.h> # include<assert.h> # include<string.h> # include<iostream> //引用前面自己實現的順序表的類的標頭檔案 using namespace std; //template<class T,class Container=Vector<T>> //class T:容器型別 class Conainer:底層空間,此時Container若是想要給定 //一個預設的引數,必須例項化的時候需要給定一個具體的型別,不能直接給一個 //Vector,因為Vector是一個模板類,不是具體的型別,此時只能給成Vector<T> template<class> class Container {};//模板類的名字 //template<class T, template<class T> class Container> template<class T,template<class> class Container=Vector> //第二個模板引數:模板類。 //template<class> class Container:模板的模板引數:模板類的引數列表<class>,不需要給出模板類的名字,此時 //是一個模板的型別而不是模板類,此時的Vector也是模板類,此時兩個模板類(Container和Vector)的引數個數也應該相同 //Container是一個模板類,只接收一個模板類的引數,而且不用把這個引數給出來 //若是此處給定模板的模板類函式<class T>,則後面例項化為物件,也必須給定模板類函式Container<T> class Stack { public: //給定建構函式 Stack() {} void Push(const T& data) { _con.PushBack(data); } void Pop() { _con.PopBack(); } T& Top() { return _con.Back(); } const T& Top()const { return _con.Back(); } size_t Size()const { return _con.Size(); } private: Container _con;//建立一個容器的物件//Container是一個具體的型別 //Container<T> _con;//Container是一個模板類 }; void Test() { Stack<int> s; s.Push(1); s.Push(2); s.Push(3); s.Push(4); s.Push(5); cout << s.Size() << endl; cout << s.Top() << endl; s.Pop(); s.Pop(); cout << s.Size() << endl; cout << s.Top() << endl; } int main() { }
二、模擬實現一個佇列
佇列是一個特殊的線性結構:只有兩種操作:在一端進行資料的插入(隊尾),在另一端進行資料的刪除操作(隊頭)
從隊頭出佇列,從隊尾入佇列
2、封裝一個佇列
使用模板函式封裝一個佇列
# include<stdio.h> # include<stdlib.h> # include<assert.h> # include<string.h> # include<iostream> using namespace std; //使用模板引數來實現一個佇列 template<class T,class Container=List<T>> //依靠底層封裝的List順序表,重新封裝一個 class Queue { public: //給出空間 Queue() {} void Push(const T& data) { _con.PushBack(data); } void Pop() { _con.PopFront(); } T& Front() { return _con.Front(); } const T& Front()const { return _con.Front(); } T& Back() { return _con.Back(); } const T& Back()const { return _con.Back(); } size_t Size()const { return _con.Size(); } bool Empty()const { return _con.Empty(); } private: Container _con; }; void Test() { Queue<int> q; q.Push(1); q.Push(2); q.Push(3); q.Push(4); q.Push(5); cout<<q.Front()<<endl; cout<<q.Back()<<endl; cout<<q.Size()<<endl; q.Pop(); q.Pop(); q.Pop(); cout<<q.Front()<<endl; cout<<q.Back()<<endl; cout<<q.Size()<<endl; } int main() { Test(); return 0; }
3、使用模板的模板引數來封裝
# include<stdio.h> # include<stdlib.h> # include<assert.h> # include<string.h> # include<iostream> using namespace std; template<class T, template<class> class Container = List> //如果帶有預設值也必須為一個模板,"List" class Queue { public: //給出空間 Queue() {} void Push(const T& data) { _con.PushBack(data); } void Pop() { _con.PopFront(); } T& Front() { return _con.Front(); } const T& Front()const { return _con.Front(); } T& Back() { return _con.Back(); } const T& Back()const { return _con.Back(); } size_t Size()const { return _con.Size(); } bool Empty()const { return _con.Empty(); } private: Container<T> _con;//通過具體的型別定義一個容器 }; void Test() { Queue<int> q; q.Push(1); q.Push(2); q.Push(3); q.Push(4); q.Push(5); cout << q.Front() << endl; cout << q.Back() << endl; cout << q.Size() << endl; q.Pop(); q.Pop(); q.Pop(); cout << q.Front() << endl; cout << q.Back() << endl; cout << q.Size() << endl; } int main() { Test(); return 0; }