1. 程式人生 > >封裝一個棧,佇列

封裝一個棧,佇列

一、棧:

特殊的線性表,只能在其一端進行資料插入和刪除操作,

特性:先進後出 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;
}