最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++模擬實(shí)現(xiàn)stack和Queue的操作示例

 更新時(shí)間:2024年06月04日 10:00:42   作者:XY.散人  
這篇文章主要介紹了C++模擬實(shí)現(xiàn)stack和Queue的操作示例,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

前言:

經(jīng)歷了list三個(gè)自定義類型的洗禮,來(lái)個(gè)簡(jiǎn)單的放松放松,即棧和隊(duì)列:

文檔記錄的,棧和隊(duì)列是一種容器適配器,它們不屬于stl,但是它們的大體結(jié)構(gòu)我們都是了解的,在數(shù)據(jù)結(jié)構(gòu)初階我們已經(jīng)用了C語(yǔ)言進(jìn)行實(shí)現(xiàn),這里用C++進(jìn)行實(shí)現(xiàn)。

1 Stack

根據(jù)文檔,stack也是使用了模板,第一個(gè)參數(shù)是數(shù)據(jù)類型,那么第二個(gè)是?

我們?cè)贑語(yǔ)言階段使用的是一個(gè)整型指針,一個(gè)size一個(gè)capacity來(lái)實(shí)現(xiàn),如果我們?cè)贑++仍然這樣實(shí)現(xiàn)就不用介紹了,沒(méi)意思了就。

后面的參數(shù)deque是另一種結(jié)構(gòu),叫做雙端隊(duì)列,后面細(xì)說(shuō),為什么引入第二個(gè)模板參數(shù)呢?

因?yàn)槲覀冇辛藇ector list基礎(chǔ),完全可以復(fù)用的,為什么復(fù)用vector list,就和deque有關(guān)了。

1.1 雙端隊(duì)列

deque是雙端隊(duì)列,那么為什么在stack queue的模板參數(shù)里面都有這個(gè)結(jié)構(gòu)呢?

因?yàn)檫@個(gè)結(jié)構(gòu)集成了vector和list,但是不是只集成了它們的優(yōu)點(diǎn)。

先簡(jiǎn)單談?wù)刣eque的結(jié)構(gòu)

list的優(yōu)點(diǎn)是插入刪除效率很高,缺點(diǎn)是不好訪問(wèn)數(shù)據(jù),vector的優(yōu)點(diǎn)是訪問(wèn)任意數(shù)據(jù)的效率很高,缺點(diǎn)是插入刪除數(shù)據(jù)如果在頭部或者中間的效率很低。

所以惠普的大佬就尋思再來(lái)一個(gè)結(jié)構(gòu),可以當(dāng)vector用也可以當(dāng)list使用,這里因?yàn)槭橇私猓跃椭苯咏o結(jié)構(gòu)了:

 看起來(lái)就像是個(gè)大 boss,當(dāng)我們存數(shù)據(jù)的時(shí)候,該結(jié)構(gòu)會(huì)開(kāi)一塊空間,比如叫buff,空間大小為16,當(dāng)一直插入數(shù)據(jù),該數(shù)據(jù)插滿之后,不會(huì)擴(kuò)容,會(huì)重新開(kāi)一塊空間,空間大小也是16,數(shù)據(jù)插好后,我們?cè)撊绾慰焖僭L問(wèn)呢?
假定開(kāi)的空間大小不變,我們想訪問(wèn)第i個(gè)數(shù)據(jù),一塊空間的大小為N,那么我們就應(yīng)該先找到i數(shù)據(jù)在第幾個(gè)空間的,在找該數(shù)據(jù)在第幾個(gè),找到在哪個(gè)空間可以i / N,第幾個(gè)可以i % N,這樣就可以快速訪問(wèn)了。

那么這么多空間應(yīng)該如何管理?

這里使用的是中控指針,即再開(kāi)一塊空間,這塊空間里面只有指針,指針指向不同的空間,但是指針是從中間開(kāi)始存儲(chǔ)的,因?yàn)樯婕暗筋^插。

但是對(duì)于deque的結(jié)構(gòu)來(lái)說(shuō),只有兩個(gè)迭代器,一個(gè)迭代器有4個(gè)指針,分別指向當(dāng)前節(jié)點(diǎn),頭結(jié)果,尾節(jié)點(diǎn)和中控指針的節(jié)點(diǎn),如果涉及到了插入刪除數(shù)據(jù),比如頭插,就要先開(kāi)一塊空間,倒著存數(shù)據(jù),那么此時(shí)找數(shù)據(jù),i就要先減去這個(gè)不滿的第一個(gè)數(shù)據(jù)塊的數(shù)據(jù)個(gè)數(shù),才能通過(guò)/ % 快速訪問(wèn)數(shù)據(jù)。中間插入數(shù)據(jù)的時(shí)候,有兩個(gè)選擇,一是重新開(kāi)空間,二是在原來(lái)的空間上擴(kuò)容,但是擴(kuò)容之后,每個(gè)空間的大小不一樣,找數(shù)據(jù)的效率就會(huì)降低了。

當(dāng)涉及刪除數(shù)據(jù)的時(shí)候,刪除了之后,后面的數(shù)據(jù)往前移動(dòng),比較麻煩。

所以別看deque集成了list vector,缺點(diǎn)也蠻多的。

比如訪問(wèn)數(shù)據(jù)的效率不極致,中間插入刪除數(shù)據(jù)也沒(méi)list快,它就比較尷尬。。

這也是為什么,stack queue的模板參數(shù)默認(rèn)是deque,這個(gè)"大哥"雖然有點(diǎn)缺點(diǎn),但是用起來(lái)也算不錯(cuò)。

我們?cè)趕tack實(shí)現(xiàn)的接口有入棧 出棧 size empty 返回棧頂元素,只有5個(gè)接口,這5個(gè)接口在vector里面都有,所以,直接使用:

namespace Free3
{
	template <class T, class container = vector<T>>
	class stack
	{
	public:
		void push(const T& val)
		{
			_con.push_back(val);
		}
		size_t size()
		{
			return _con.size();
		}
		bool empty()
		{
			return _con.empty();
		}
		T& top()
		{
			return _con.back();
		}
		void pop()
		{
			_con.pop_back();
		}
	private:
		container _con;
	};
 
}

這里有個(gè)很厲害的點(diǎn)就是,模板參數(shù)也可以有缺省值,我們給上vector<int>,那么默認(rèn)的用vector來(lái)實(shí)現(xiàn)stack。

測(cè)試代碼如下:

#include "Stack.h"
using namespace Free3;
int main()
{
	Free3::stack<int, vector<int>> s1;
	Free3::stack<int> s2;
	s1.push(1);
	s1.push(2);
	s1.push(3);
	s1.push(4);	
	s2.push(1);
	s2.push(2);
	s2.push(3);
	s2.push(4);
	s2.push(5);
	while (!s2.empty())
	{
		cout << s2.top() << " ";
		s2.pop();
	}
	cout << endl;
	return 0;
}

2 Queue

隊(duì)列這里還有點(diǎn)不一樣,棧可以用vector也可以用list,但是隊(duì)列不行,隊(duì)列的出隊(duì),相當(dāng)于是頭刪,如果非要用vector里面的erase來(lái)頭刪也可以,但是效率很差,是O(N),這里就非常不推薦,所以隊(duì)列就用list來(lái)實(shí)現(xiàn)。

namespace Free4
{
	template<class T>
	class Queue
	{
	public:
		void push(const T& val)
		{
			_con.push_back(val);
		}
		void pop()
		{
			_con.pop_front();
		}
		size_t size()
		{
			return _con.size();
		}
		T& front()
		{
			return _con.front();
		}
		bool empty()
		{
			return _con.empty();
		}
 
	private:
		list<T> _con;
	};
 
}

以上就是C++模擬實(shí)現(xiàn)stack和Queue的操作示例的詳細(xì)內(nèi)容,更多關(guān)于C++實(shí)現(xiàn)stack和Queue的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語(yǔ)言多媒體框架GStreamer使用教程深講

    C語(yǔ)言多媒體框架GStreamer使用教程深講

    GStreamer 是用來(lái)構(gòu)建流媒體應(yīng)用的開(kāi)源多媒體框架(framework),其目標(biāo)是要簡(jiǎn)化音/視頻應(yīng)用程序的開(kāi)發(fā),已經(jīng)能夠被用來(lái)處理像 MP3、Ogg、MPEG1、MPEG2、AVI、Quicktime 等多種格式的多媒體數(shù)據(jù)
    2022-07-07
  • Visual Studio 2019修改編碼UTF-8的實(shí)現(xiàn)

    Visual Studio 2019修改編碼UTF-8的實(shí)現(xiàn)

    這篇文章主要介紹了Visual Studio 2019修改編碼UTF-8的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 適合初學(xué)者的C語(yǔ)言轉(zhuǎn)義字符講解

    適合初學(xué)者的C語(yǔ)言轉(zhuǎn)義字符講解

    轉(zhuǎn)義字符是很多程序語(yǔ)言、數(shù)據(jù)格式和通信協(xié)議的形式文法的一部分。對(duì)于一個(gè)給定的字母表,一個(gè)轉(zhuǎn)義字符的目的是開(kāi)始一個(gè)字符序列,使得轉(zhuǎn)義字符開(kāi)頭的該字符序列具有不同于該字符序列單獨(dú)出現(xiàn)(沒(méi)有轉(zhuǎn)義字符開(kāi)頭)時(shí)的語(yǔ)義。因此轉(zhuǎn)義字符開(kāi)頭的字符序列被叫做轉(zhuǎn)義序列
    2022-04-04
  • Linux下如何使用C++獲取硬件信息

    Linux下如何使用C++獲取硬件信息

    這篇文章主要為大家詳細(xì)介紹了如何使用C++實(shí)現(xiàn)獲取CPU,主板,磁盤(pán),BIOS信息等硬件信息,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-04-04
  • GCC 編譯使用動(dòng)態(tài)鏈接庫(kù)和靜態(tài)鏈接庫(kù)的方法

    GCC 編譯使用動(dòng)態(tài)鏈接庫(kù)和靜態(tài)鏈接庫(kù)的方法

    根據(jù)鏈接時(shí)期的不同,庫(kù)又有靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)之分,有別于靜態(tài)庫(kù),動(dòng)態(tài)庫(kù)的鏈接是在程序執(zhí)行的時(shí)候被鏈接的
    2013-03-03
  • 基于C語(yǔ)言實(shí)現(xiàn)迷宮游戲的示例代碼

    基于C語(yǔ)言實(shí)現(xiàn)迷宮游戲的示例代碼

    這篇文章主要介紹了基于C語(yǔ)言如何實(shí)現(xiàn)簡(jiǎn)單的迷宮游戲,對(duì)于學(xué)習(xí)游戲開(kāi)發(fā)的朋友相信有一定的借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • windows下安裝QT及visual studio 2017搭建開(kāi)發(fā)環(huán)境

    windows下安裝QT及visual studio 2017搭建開(kāi)發(fā)環(huán)境

    這篇文章主要介紹了windows下安裝QT及visual studio 2017搭建開(kāi)發(fā)環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C++計(jì)算每個(gè)字符出現(xiàn)的次數(shù)

    C++計(jì)算每個(gè)字符出現(xiàn)的次數(shù)

    這篇文章主要介紹了C++計(jì)算每個(gè)字符出現(xiàn)的次數(shù)的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • Qt 元對(duì)象系統(tǒng)中QMetaEnum的應(yīng)用

    Qt 元對(duì)象系統(tǒng)中QMetaEnum的應(yīng)用

    本文主要介紹了Qt 元對(duì)象系統(tǒng)中QMetaEnum的應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • c++中struct和class的區(qū)別小結(jié)

    c++中struct和class的區(qū)別小結(jié)

    在C++中,class和struct都是用于定義自定義數(shù)據(jù)類型的關(guān)鍵字,本文主要介紹了c++中struct和class的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08

最新評(píng)論

东乡族自治县| 如皋市| 玛纳斯县| 贵南县| 韶关市| 西乡县| 兴安盟| 敦煌市| 汝南县| 阜新市| 鄂托克旗| 共和县| 涪陵区| 准格尔旗| 石门县| 称多县| 孝感市| 刚察县| 当阳市| 黎城县| 余干县| 梁平县| 景宁| 张家口市| 平江县| 自治县| 新安县| 临武县| 习水县| 察雅县| 崇礼县| 游戏| 多伦县| 崇义县| 靖江市| 大安市| 依兰县| 南昌市| 庆安县| 方山县| 民丰县|