1. 程式人生 > >佇列模擬實現

佇列模擬實現

佇列的特點:

先進先出/後進後出

佇列的常見操作:

Push——往隊尾插入一個元素

Pop——從隊頭刪除一個元素

Front——返回佇列的第一個元素

Back——返回佇列的最後一個元素

Size——求佇列的元素個數

Empty——判斷佇列是否為空

佇列的模擬實現:

#include<assert.h>

template<class T>
struct QueueNode
{
	T _data;
	QueueNode<T>* _next;

	QueueNode(const T& data)
		: _data(data)
		, _next(NULL)
	{}
};

template<class T>
class Queue
{
	typedef QueueNode<T> Node;
public:
	Queue()		//建構函式
		: _head(NULL)
		, _tail(NULL)
	{}

	~Queue()		//解構函式
	{
		Node* cur = _head;
		while (cur)
		{
			Node* del = cur;
			cur = cur->_next;
			delete del;
		}
	}

	void Push(const T& data)	//在末尾插入一個數
	{
		if (_head == NULL)		//為空
		{
			_head = _tail = new Node(data);
		}
		else      //不為空
		{
			_tail->_next = new Node(data);
			_tail = _tail->_next;
		}
	}

	void Pop()					//刪除第一個元素
	{
		if (_head == _tail)	//只有一個元素時
		{
			delete _head;
			_head = _tail = NULL;
		}
		else               //有多個元素時
		{
			Node* del = _head;
			_head = _head->_next;

			delete del;
		}
	}

	size_t Size()	//返回佇列中元素的個數
	{
		size_t count = 0;
		Node* cur = _head;
		while (cur)
		{
			++count;
			cur = cur->_next;
		}
		return count;
	}

	T& Front()	//返回佇列中的第一個元素
	{
		assert(_head);
		return _head->_data;
	}

	T& Back()	//返回佇列的最後一個元素
	{
		assert(_tail);
		return _tail->_data;
	}

	bool Empty()	//判斷一個佇列是否為空
	{
		return _head == NULL;
	}

protected:
	Node* _head;
	Node* _tail;
};


void TestQueue()
{
	Queue<int> q;
	q.Push(1);
	q.Push(2);
	q.Push(3);
	q.Push(4);
	q.Push(5);

	cout << q.Size() << endl;
	while (!q.Empty())
	{
		cout << q.Front() << " ";
		q.Pop();
	}
	cout << endl;
}

#include<iostream>
using namespace std;
#include "queue.h"

int main()
{
	TestQueue();
	system("pause");
	return 0;
}
程式碼執行結果:



相關推薦

佇列模擬實現

佇列的特點: 先進先出/後進後出 佇列的常見操作: Push——往隊尾插入一個元素 Pop——從隊頭刪除一個元素 Front——返回佇列的第一個元素 Back——返回佇列的最後一個元素 Size

多級反饋佇列排程(模擬實現

演算法描述(來自百度): 1、程序在進入待排程的佇列等待時,首先進入 優先順序最高的Q1等待。 2、首先排程優先順序高的佇列中的程序。若高優先順序中佇列中已沒有排程的程序,則排程次 優先順序佇列中的程序。例如:Q1,Q2,Q3三個佇列,當且僅當在Q1中沒有程序等待時才去排程Q2,同理,

如何用兩個棧模擬實現一個佇列? 如果這兩個堆疊的容量分別是m和n(m>n),你的方法能保證佇列的最大容量是多少?

保證入隊完畢之後才可以出隊; 分析:棧的特點是“後進先出(LIFO)”,而佇列的特點是“先進先出(FIFO)”。用兩個棧模擬實現一個佇列的基本思路是:用一個棧作為儲存空間,另一個棧作為輸出緩衝區,入隊時把元素按順序壓入兩棧模擬的佇列,出隊時按入隊的順序出棧即可。      如下圖,用容

棧/佇列 互相模擬實現

用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。 思路:大概這麼想:用一個輔助棧把進第一個棧的元素倒一下就好了。 比如進棧1,2,3,4,5 第一個棧: 5 4 3 2 1 然後倒到第二個棧裡 1 2 3 4 5

劍指offer面試題9:用兩個棧實現佇列(兩個佇列模擬棧)

 題目描述: 用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。 思路一:有點死腦筋,每次pop後都預設下次是push操作,,,,。233主要是由於沒把握好兩個棧模擬時入隊和出隊的時機。考慮stack1和stack2的大小和入隊出隊的關係即可改

Day3 Coding one 用容器模擬實現堆疊和佇列結構

需求:利用容器實現堆疊和佇列結構 解決方案: 1.collection介面中存在著子介面List介面,List介面中有LinkedList的實現類,LinkedList中有特有的定義方法,利用頭尾展開定義。可以建立一個堆疊或者佇列的資料結構物件,該物件是使用Li

【C++】模擬實現佇列

一、佇列簡介 佇列是一種只允許在一段進行插入,另外一段進行刪除的特殊線性表,允許刪除操作的一端稱為隊頭,允許插入操作的一端稱為隊尾。 佇列又被稱為先進先出的線性表。 與棧類似,佇列也有兩種儲存結構,一

【c++】模擬實現迴圈佇列 三種方法(標識、浪費一個空間、計數器)

什麼是迴圈佇列? 為充分利用向量空間,克服”假溢位“現象的方法:將向量空間想象為一個首尾相接的圓環,並稱這種向量為迴圈向量。儲存在其中的佇列稱為迴圈佇列(Circular Queue)。 假象成如圖: 但實際上儲存空間還是一段連續的空間。 空佇列: 當有元素入隊時:

阻塞佇列及 wait notify模擬實現 BlockingQueue

一、阻塞佇列 阻塞佇列與普通佇列的區別在於,當佇列是空的時,從佇列中獲取元素的操作將會被阻塞,或者當佇列是滿時,往佇列裡新增元素的操作會被阻塞。試圖從空的阻塞佇列中獲取元素的執行緒將會被阻塞,直到其他的執行緒往空的佇列插入新的元素。二、wait notify實現阻塞

python基礎作業------模擬實現一個ATM + 購物商城程序

setting water 轉賬 atm 結算 pan auth hide use 模擬實現一個ATM + 購物商城程序 作業需求: 額度 15000或自定義 實現購物商城,買東西加入 購物車,調用信用卡接口結賬 可以提現,手續費5% 每月22號出賬單,每月10號為還款日

模擬實現簡化版List叠代器&嵌入List

元素 sort 可能 節點數 != ring type 部分 分配 1、叠代器(iterators)概念(1)叠代器是一種抽象的設計概念,其定義為:提供一種方法,使他能夠按順序遍歷某個聚合體(容器)所包含的所有元素,但又不需要暴露該容器的內部表現方式。 (2)叠代器是一種行

集合的模擬實現(函數模板)

delete bcd break 一行 其中 執行 eset 數據類型 turn 我們可以用一個數組來模擬集合,add運算用以實現集合元素的增加,delete運算用於實現集合元素的刪除,find運算用以實現集合元素的查找,但是目前集合元素類型未知,可以是int、char、d

用ES5模擬實現ES6中的Map類

fun 遍歷 false 創建 per 映射 .get script 實例 ECMAScript6原生實現了Map類,即我們所說的字典,字典和集合很像,不過集合是以值值得形式存儲元素,字典則是以鍵值的形式存儲元素。字典也叫映射。 1. 創建一個字典 function M

模擬實現MyBites中通過SQL反射實體類對象功能

println sub var void mysql exc 模擬實現 obj 執行 話不多說,直接上幹貨! package cn.test; import java.lang.reflect.Method; import java.sql.Connection; im

模擬實現一個ATM + 購物商城程序

接口 模擬實現 bsp 日常 賬戶 操作日誌 信用卡 提現 信用 需求: 額度 15000或自定義 實現購物商城,買東西加入 購物車,調用信用卡接口結賬 可以提現,手續費5% 支持多賬戶登錄 支持賬戶間轉賬 記錄每月日常消費流水 提供還款接口 ATM記錄操作日誌 提供管

實驗:模擬實現主機跨路由通信

更改 繼續 畫出 nor -a logs padding 找不到 讓我 p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; fo

ATM:模擬實現一個ATM + 購物商城程序

模擬實現 操作日誌 提現 賬戶 管理 購物商城 裝飾 用戶 程序 額度 15000或自定義 實現購物商城,買東西加入 購物車,調用信用卡接口結賬 可以提現,手續費5% 支持多賬戶登錄 支持賬戶間轉賬 記錄每月日常消費流水 提供還款接口 ATM記錄操作日誌 提供管理接口,包括

實驗:模擬實現智能DNS

智能dns當用戶訪問一個網站的時候,怎樣才能將訪問速度達到最佳呢?有事所有網站尤其是一些電商網站都會關心的的問題,這時候就出現了智能DNS的概念,通俗的說,智能DNS就是在用戶訪問一個網站的時候,DNS服務器就會將離它最近的區域代理服務器的IP地址,塔高訪問速度。一、實驗準備1、智能DNS底層是基於acl控制

C語言模擬實現strstr函數,strrstr 函數

c語言 模擬實現 strstr strstr和strrstr已經算是字符串中相對比較難的了,但是只要我們善於分析,解剖字符串,就會化難為易。其實學習代碼的過程中需要我們靜下心來分析,理解。 srtstr函數的功能及用法 原型:char *strstr(const char *dst, const

mysql, mariadb刪庫、恢復的模擬實現

數據 數據恢復 mysql mariadb 刪庫 模擬場景:周日全備份 -- 周一10:00刪庫db1,-- 10:10發現某些頁面無法訪問,如何恢復數據?註意: 由於庫不僅僅一個,因此db1刪除,用戶可能正常的訪問db2,但是多個數據庫之間往往是有關聯的, 如商品數