1. 程式人生 > >容器介面卡(棧容器介面卡、佇列容器介面卡)

容器介面卡(棧容器介面卡、佇列容器介面卡)

我們已有的容器(比如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;
}

有了容器介面卡,棧和佇列就可以用順序表和連結串列來做模板引數進行操作。