国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

優(yōu)先隊列----數(shù)據(jù)結(jié)構(gòu)

這篇具有很好參考價值的文章主要介紹了優(yōu)先隊列----數(shù)據(jù)結(jié)構(gòu)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

概念

不知道你玩過英雄聯(lián)盟嗎?英雄聯(lián)盟里面的防御塔會攻擊離自己最近的小兵,但是如果有炮車兵在塔內(nèi),防御塔會優(yōu)先攻擊炮車(因為炮車的威脅性更大),只有沒有兵線在塔內(nèi)時,防御塔才會攻擊英雄。所以你可以得出優(yōu)先級:距離最近的炮車 >?炮車 > 距離最近的小兵 > 小兵 > 距離最近的英雄 > 英雄。

優(yōu)先隊列----數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,算法

那什么是優(yōu)先隊列?首先它是一個隊列,它的入隊順序沒有發(fā)生改變,但是出隊的順序是根據(jù)優(yōu)先級的高低來實現(xiàn)的,遍歷隊列,優(yōu)先級高的先出隊,有多個節(jié)點具有最高的優(yōu)先級,選取遇到的第一個具有最高的優(yōu)先級的節(jié)點。?

優(yōu)先隊列----數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,算法

空隊列

優(yōu)先隊列----數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,算法

插入一個元素

優(yōu)先隊列----數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,算法

插入第二個元素

優(yōu)先隊列----數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,算法

?刪除一個節(jié)點

優(yōu)先隊列----數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,算法

優(yōu)先隊列----數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,算法

上列情況是最普通的情況(無需多余的操作),顯然如果刪除的是隊列中的最后一個節(jié)點,尾指針需要手動移動;如果刪除的是隊列中的第一個節(jié)點,頭指針會自動移動。如果刪除的隊列只有一個節(jié)點,那頭尾指針需要手動置空。所以總共有 2?種情況需要考慮。

隊列的算法實現(xiàn)

隊列的結(jié)構(gòu)體定義

其中優(yōu)先級的高低是自己定義的,你也可以令 0 為最高優(yōu)先級,優(yōu)先級數(shù)也不只有這 9 個。

#define MAX_SIZE 15
typedef int DateElem;

typedef struct _QNode
{
	int priority; //節(jié)點的優(yōu)先級,9為最高優(yōu)先級,0為最低優(yōu)先級,優(yōu)先級相同的取第一個
	DateElem date;
	struct _QNode* next;
}QNode;

typedef QNode* QueuePtr; //QueuePtr a; 就定義了一個指向結(jié)構(gòu)體QNode的指針

typedef struct _Queue
{
	int length;    //隊列長度
	QueuePtr head; //頭指針
	QueuePtr tail; //尾指針
}Queue;

隊列的初始化、判空、判滿、插入

//隊列的初始化,初始化為空隊列
void initQueue(Queue* q)
{
	if (!q) //指向隊頭的指針為空
	{
		return;
	}

	q->head = NULL;
	q->tail = NULL;
	q->length = 0;
}

//判斷隊列是否為空
bool IsEmpty(Queue* q)
{
	if (!q) return false;

	if (q->head == NULL) //條件用 q->tail == NULL 也行
	{
		return true;
	}

	return false; //不為空
}


//判斷隊列是否為滿
bool IsFull(Queue* q)
{
	if (!q) return false;

	if (q->length >= MAX_SIZE) //也可以用 q->length == MAX_SIZE
	{
		return true;
	}

	return false;
}

//入隊
bool enterQueue(Queue* q, DateElem e, int priority)
{
	if (!q || IsFull(q))
	{
		cout << "隊列已滿" << endl;
		return false;
	}

	QNode* p = new QNode;

	//if (!q) return false; 一般不會生成失敗

	p->priority = priority;
	p->date = e;
	p->next = NULL;

	//插入有兩種情況
	if (IsEmpty(q)) //空隊列
	{
		q->head = p;
		q->tail = p;
	}
	else //隊列中已有元素
	{
		q->tail->next = p; //隊列中的最后一個節(jié)點的next指針指向新加節(jié)點
		q->tail = p;	   //更新尾指針
	}

	q->length++;
	return true;
}

出隊

唯一與普通隊列有較大差別的就是隊列的出隊,其他的操作變化很小。

//遍歷隊列
bool popQueue(Queue* q,DateElem *out)
{
	if (!q || IsEmpty(q))
	{
		cout << "隊列為空" << endl;
		return false;
	}

	if (!out)
	{
		cout << "無法傳遞刪除節(jié)點的值" << endl;
		return false;
	}


	QNode** prev_node_next = NULL; //二級指針,指向優(yōu)先級最高的節(jié)點的前一個節(jié)點的next指針
	QNode* prev_node = NULL; //指向優(yōu)先級最高的節(jié)點的前一個節(jié)點
	QNode* temp = NULL,*last = NULL; //temp遍歷隊列,last指向temp指向的前一個節(jié)點

	prev_node_next = &(q->head); //最開始指向隊頭指針(也就是第一個節(jié)點的前一個節(jié)點的next指針),解引用就是指向第一個節(jié)點

	last = q->head; 
	temp = last->next; 

	while (temp != NULL)
	{
		if (temp->priority > (*prev_node_next)->priority)
		{
			cout << "找到了一個更高的優(yōu)先級:" << temp->priority << endl;
			prev_node_next = &(last->next); //指向temp的前一個節(jié)點的next指針
			prev_node = last; //指向temp的前一個節(jié)點
		}
		last = temp;
		temp = temp->next;
	}

	*out = (*prev_node_next)->date; //傳遞出隊元素的值
	temp = *prev_node_next;  // temp指向要刪除節(jié)點
	*prev_node_next = (*prev_node_next)->next; //或者是 prev_node_next = & (*prev_node_next)->next;

	delete temp;
	q->length--;


	//情況一:刪除節(jié)點后為空隊列
	if (q->length == 0)
	{
		q->head = q->tail = NULL;
	}
	//情況二:刪除的是尾節(jié)點
	else if ( *prev_node_next == NULL && prev_node != NULL)
	{
		q->tail = prev_node;
	}
	//情況三:刪除的是首節(jié)點,與情況一不同的是刪除節(jié)點后,隊列不為空
	//情況四:普通情況
	//這兩種情況遍歷結(jié)束后的調(diào)整中頭尾指針就弄好了

	return true;
}

如果你覺得我這里寫得不好,嘻嘻,因為明明只需要用一級指針,我偏要用二級指針,這就是我與明明的區(qū)別,哈哈,好了不開玩笑,可以看看下圖幫助理解。

優(yōu)先隊列----數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,算法

隊列的打印、清空、獲取隊首元素

//打印隊列
bool Print(Queue* q)  
{
	if (!q) return false;

	if (IsEmpty(q))
	{
		cout << "隊列為空" << endl;
	}

	QNode* p = q->head;
	cout << "隊列中的元素:";
	while (p != NULL)
	{
		printf("%d[優(yōu)先級%d] ", p->date,p->priority);
		p = p->next;
	}
	cout << endl;
	return true;
}
//清空隊列
bool ClearQueue(Queue* q)
{
	if (!q || IsEmpty(q)) return false;

	QNode* temp = q->head, * tmp = NULL;

	while (temp != NULL)
	{
		tmp = temp->next;
		delete temp;
		temp = tmp;
	}

	q->length = 0;
	q->head = NULL;
	q->tail = NULL;
	return true;
}

//獲取隊頭
bool GetHead(Queue* sq, DateElem* date)
{
	if (!date || !sq || IsEmpty(sq))return false;

	*date = sq->head->date; 
	return true;

}

主函數(shù)測試代碼

int main(void)
{
	Queue* q = new Queue;
	DateElem e = -1;
	initQueue(q);

	for (int i = 0; i < 10; i++)
	{
		enterQueue(q, i + 2, i);
	}

	printf("隊列中有%d個元素\n", q->length);

	Print(q);

	for (int i = 0; i < 5; i++)
	{
		if (popQueue(q, &e))
		{
			cout << "出隊的元素是:" << e << endl;
		}
		else
		{
			cout << "出隊失敗" << endl;
		}
	}

	cout << "出隊后,";
	Print(q);

	cout << "清空隊列后,";
	ClearQueue(q);
	Print(q);

	//清理資源
	delete q;

	return 0;
}

?運行結(jié)果:

優(yōu)先隊列----數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c++,算法文章來源地址http://www.zghlxwxcb.cn/news/detail-737684.html

到了這里,關于優(yōu)先隊列----數(shù)據(jù)結(jié)構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 數(shù)據(jù)結(jié)構(gòu)-優(yōu)先級隊列(堆)

    數(shù)據(jù)結(jié)構(gòu)-優(yōu)先級隊列(堆)

    文章目錄 目錄 文章目錄 前言 一 . 堆 二 . 堆的創(chuàng)建(以大根堆為例) 堆的向下調(diào)整(重難點) ?堆的創(chuàng)建 ?堆的刪除 向上調(diào)整 堆的插入 三 . 優(yōu)先級隊列 總結(jié) 大家好,今天給大家講解一下堆這個數(shù)據(jù)結(jié)構(gòu)和它的實現(xiàn) - 優(yōu)先級隊列 堆(Heap)是一種基于完全二叉樹的數(shù)據(jù)結(jié)構(gòu),具有

    2024年02月08日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)】優(yōu)先級隊列——堆

    【數(shù)據(jù)結(jié)構(gòu)】優(yōu)先級隊列——堆

    ??????????個人主頁?????????? ??????????數(shù)據(jù)結(jié)構(gòu)專欄?????????? ??????????【數(shù)據(jù)結(jié)構(gòu)】非線性結(jié)構(gòu)——二叉樹?????????? 前面介紹過隊列,隊列是一種先進先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),但有些情況下,操作的數(shù)據(jù)可能帶有優(yōu)先級,一般出隊列時,可能

    2024年04月14日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu):優(yōu)先級隊列(堆)

    數(shù)據(jù)結(jié)構(gòu):優(yōu)先級隊列(堆)

    隊列是一種先進先出 (FIFO) 的數(shù)據(jù)結(jié)構(gòu) ,但有些情況下, 操作的數(shù)據(jù)可能帶有優(yōu)先級,一般出隊 列時,可能需要優(yōu)先級高的元素先出隊列。 在這種情況下, 數(shù)據(jù)結(jié)構(gòu)應該提供兩個最基本的操作,一個是返回最高優(yōu)先級對象,一個是添加新的對象 。這種數(shù)據(jù)結(jié)構(gòu)就是 優(yōu)先級

    2024年02月08日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)——優(yōu)先隊列c++詳解

    百度百科定義 優(yōu)先隊列是0個或多個元素的集合,每個元素都有一個優(yōu)先權(quán)或值,對優(yōu)先隊列執(zhí)行的操作有1) 查找;2) 插入一個新元素;3) 刪除.在最小優(yōu)先隊列(min priority queue)中,查找操作用來搜索優(yōu)先權(quán)最小的元素,刪除操作用來刪除該元素;對于最大優(yōu)先隊列(max priority queue),查找操

    2024年02月09日
    瀏覽(32)
  • 數(shù)據(jù)結(jié)構(gòu) 之 優(yōu)先級隊列(堆) (PriorityQueue)

    數(shù)據(jù)結(jié)構(gòu) 之 優(yōu)先級隊列(堆) (PriorityQueue)

    ??歡迎大家觀看AUGENSTERN_dc的文章(o゜▽゜)o☆?? ??感謝各位讀者在百忙之中抽出時間來垂閱我的文章,我會盡我所能向的大家分享我的知識和經(jīng)驗?? ??希望我們在一篇篇的文章中能夠共同進步?。?! ??個人主頁:AUGENSTERN_dc ??個人專欄:C語言?|?Java | 數(shù)據(jù)結(jié)構(gòu) ?個人

    2024年03月20日
    瀏覽(27)
  • 數(shù)據(jù)結(jié)構(gòu) - 堆(優(yōu)先隊列)+ 堆的應用 + 堆練習

    數(shù)據(jù)結(jié)構(gòu) - 堆(優(yōu)先隊列)+ 堆的應用 + 堆練習

    1、本文章適合新學和復習用,都是用c語言實現(xiàn)的,包含了堆的講解、堆的應用、堆的練習。 2、有圖解和代碼都注釋,放心食用哦 那么開始: 一、什么是堆 堆(Heap)是計算機科學中一類特殊的數(shù)據(jù)結(jié)構(gòu),是最高效的優(yōu)先級隊列。堆通常是一個可以被看作一棵完全二叉樹的數(shù)組

    2024年03月11日
    瀏覽(29)
  • 數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊列【堆】(Heap)

    數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊列【堆】(Heap)

    目錄 1. 優(yōu)先級隊列(Priority Queue) 2.堆的概念 3.堆的存儲方式 4.堆的創(chuàng)建 5.用堆模擬實現(xiàn)優(yōu)先級隊列 ?6.PriorityQueue常用接口介紹 6.1?PriorityQueue的特點 6.2?PriorityQueue幾種常見的構(gòu)造方式 7.top-k問題 8.堆排序 本篇主要內(nèi)容總結(jié) (1)優(yōu)先級隊列底層是堆來實現(xiàn)的 (2)堆的本質(zhì)是

    2024年02月01日
    瀏覽(51)
  • 【數(shù)據(jù)結(jié)構(gòu)】 優(yōu)先級隊列(堆)與堆的建立

    【數(shù)據(jù)結(jié)構(gòu)】 優(yōu)先級隊列(堆)與堆的建立

    前面介紹過隊列, 隊列是一種先進先出(FIFO)的數(shù)據(jù)結(jié)構(gòu) ,但有些情況下,操作的數(shù)據(jù)可能帶有優(yōu)先級,一般出隊列時,可能需要優(yōu)先級高的元素先出隊列,該中場景下,使用隊列顯然不合適。 比如:在手機上玩游戲的時候,如果有來電,那么系統(tǒng)應該優(yōu)先處理打進來的電話

    2024年02月10日
    瀏覽(18)
  • 數(shù)據(jù)結(jié)構(gòu) - 6(優(yōu)先級隊列(堆)13000字詳解)

    數(shù)據(jù)結(jié)構(gòu) - 6(優(yōu)先級隊列(堆)13000字詳解)

    堆分為兩種:大堆和小堆。它們之間的區(qū)別在于元素在堆中的排列順序和訪問方式。 大堆(Max Heap): 在大堆中,父節(jié)點的值比它的子節(jié)點的值要大。也就是說,堆的根節(jié)點是堆中最大的元素。大堆被用于實現(xiàn)優(yōu)先級隊列,其中根節(jié)點的元素始終是隊列中最大的元素。 大堆

    2024年02月08日
    瀏覽(25)
  • Java 數(shù)據(jù)結(jié)構(gòu)篇-用數(shù)組、堆實現(xiàn)優(yōu)先級隊列

    Java 數(shù)據(jù)結(jié)構(gòu)篇-用數(shù)組、堆實現(xiàn)優(yōu)先級隊列

    ??博客主頁:?【 小扳_-CSDN博客】 ?感謝大家點贊??收藏?評論? ?? 文章目錄 ? ? ? ? 1.0 優(yōu)先級隊列說明 ? ? ? ? 2.0 用數(shù)組實現(xiàn)優(yōu)先級隊列 ? ? ? ? 3.0?無序數(shù)組實現(xiàn)優(yōu)先級隊列 ? ? ? ? 3.1 無序數(shù)組實現(xiàn)優(yōu)先級隊列 - 入隊列 offer(E value) ? ? ? ? 3.2 無序數(shù)組實現(xiàn)優(yōu)先

    2024年02月04日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包