1. 程式人生 > >順序表示的佇列——順序佇列1——基本內容

順序表示的佇列——順序佇列1——基本內容

佇列

佇列是一種受限的線性表。它只允許在表的一端進行插入,另一端進行刪除。佇列具有“先入先出”的特性,它的應用非常廣泛,它主要應用在樹的層次遍歷、圖的廣度優先遍歷、鍵盤的輸入緩衝區、作業系統和事務管理等方面。

【定義】

佇列(queue)是一種先進先出(First In First Out , FIFO)的線性表,它只允許在表的一端插入元素,另一端刪除元素。其中,允許插入的一端稱為隊尾(rear),允許刪除的一端稱為對頭(front)。

一個佇列為q=(a1,a2,...,an), 如圖

 那麼a1為對頭元素,an為隊尾元素。最早進入佇列的元素也會最早出來,只有當最先進入佇列的元素都出來以後,後進入的元素才能退出。

在日常生活中,人們去銀行辦理業務需要排隊,這就類似我們提到的佇列。每一個新來辦理業務的需要按照機器自動生成的編號等待辦理,只有前面的人辦理完畢,才能輪到排在後面的人辦理業務。新來的人進入排隊狀態就相當於入隊,前面辦理完業務離開的就相當於出隊。
佇列有兩種儲存表示:順序儲存和鏈式儲存。採用順序儲存結構的佇列被稱為順序佇列,採用鏈式儲存結構的佇列稱為鏈式佇列。

【順序佇列】

順序佇列通常採用一維陣列儲存佇列中的元素,另外增加兩個指標分別指示陣列中存放的隊首元素和隊尾元素。其中指向隊首元素的指標稱為隊頭指標front,指向隊尾元素的指標稱為隊尾指標rear。
佇列為空時,隊頭指標front和隊尾指標rear都指向下標為0的儲存單元,當元素a,b,c,d,e,f,g依次進入佇列後,元素a~g分別存放在陣列下標為0~6的儲存單元中,隊頭指標front指向元素a,隊尾指標指rear向元素g的下一位置。如圖所示。
 

【假溢位】

但是按照前面介紹的順序儲存方式,容易出現“假溢位”。所謂“假溢位”,就是經過多次插入和刪除操作後,實際佇列還有儲存空間,但是又無法向佇列中插入元素。
例如在圖中佇列刪除a和b,然後依次插入h、i和j,當插入j後,就會出現隊尾指標rear越出陣列的下界造成“假溢位”,如圖

【順序迴圈佇列】

當隊尾指標rear或隊頭指標front到達儲存空間的最大值時(假定佇列的儲存空間為QueueSize),讓隊尾指標或者隊頭指標轉化為0,這樣就可以將元素插入到佇列的空閒儲存單元中,有效的利用儲存空間,消除“假溢位”。
例如在上面的例子中,插入元素j後,rear將變為0,這樣就將j插入下標為0的儲存單元中。這樣順序佇列的儲存空間就構成了一個邏輯上收尾相連的迴圈佇列。
要把用陣列表示的順序佇列構成迴圈佇列,只需要一個簡單的取餘操作即可實現。例如當隊尾指標rear=9(假設QueueSize=10)時,如果要將新元素入隊,則先令rear=(rear+1)%10,這樣rear就等於0,這樣利用取餘操作就實現了佇列邏輯上的首尾相連,然後將元素存入佇列的第0號單元。

【隊空和隊滿】

在迴圈佇列中,隊空和隊滿時隊頭front和隊尾指標rear同時都會指向同一儲存單元,即front==rear,如圖所示。

隊空 

隊滿 

如何區分隊空和隊滿呢?有以下兩種方法:

(1)增加一個標誌位。設標誌位為tag,初始時,tag=0;當入隊成功,則tag=1;出隊成功,tag=0。則判斷隊空的條件為:front==rear&&tag==0;隊滿的條件為:front==rear&&tag==1;
(2)少用一個儲存單元。隊空的判斷條件為front==rear;隊滿的判斷條件為front==(rear+1)%QueueSize。
隊滿的狀態如圖。
 

【儲存結構】

typedef struct Squeue
{
	DataType queue[QueueSize];
	int front, rear;
}SeqQueue;

【基本運算】

(1)初始化佇列

void InitQueue(SeqQueue *SCQ)
{
	SCQ->front = SCQ->rear = 0;
}

(2)判斷佇列是否為空

int QueueEmpty(SeqQueue SCQ)
{
	if (SCQ.front==SCQ.rear)
	{
		return 1;

	}
	else
	{
		return 0;
	}
}

(3)將元素e入隊

int EnQueue(SeqQueue *SCQ, DataType e)
{
	if (SCQ->front==(SCQ->rear+1)%QueueSize)
	{
		return 0;
	}
	SCQ->queue[SCQ->rear] = e;
	SCQ->rear = (SCQ->rear + 1) % QueueSize;
	return 1;
}

(4)隊頭元素出隊


int DeQueue(SeqQueue *SCQ, DataType *e)
{
	if (SCQ->front==SCQ->rear)
	{
		return 0;
	}
	else
	{
		*e = SCQ->queue[SCQ->front];
		SCQ->front = (SCQ->front + 1) % QueueSize;
		return 1;
	}
}

(5)取隊頭元素


int GetHead(SeqQueue SCQ, DataType *e)
{
	if (SCQ.front==SCQ.rear)
	{
		return 0;
	}
	else
	{
		*e = SCQ.queue[SCQ.front];
		return 1;
	}
}

(6)清空佇列

void ClearQueue(SeqQueue *SCQ)
{
	SCQ->front = SCQ->rear = 0;

}

相關推薦

順序表示佇列——順序佇列1——基本內容

佇列 佇列是一種受限的線性表。它只允許在表的一端進行插入,另一端進行刪除。佇列具有“先入先出”的特性,它的應用非常廣泛,它主要應用在樹的層次遍歷、圖的廣度優先遍歷、鍵盤的輸入緩衝區、作業系統和事務管理等方面。 【定義】 佇列(queue)是一種先進先出(First In

鏈式表示佇列——鏈式佇列1——基本內容

【定義】 鏈式佇列通常用連結串列實現。在佇列中分別需要一個指向隊頭和隊尾的指標表示隊頭和隊尾,這兩個指標分別稱為隊頭指標和隊尾指標,不帶頭結點的鏈式佇列和帶頭結點的鏈式佇列分別如圖所示。 對於帶頭結點的鏈式佇列,當佇列為空時,隊頭指標front和隊尾指標rear都指向頭結點,如圖所示

廣義表1——基本內容

廣義表 與陣列一樣,廣義表也是線性表的推廣。它是一種遞迴定義的資料結構,但其資料元素的結構型別可以不同,其元素可以是普通元素,也可以是廣義表。廣義表被廣泛應用於人工智慧等領域的表處理語言Lisp中它把廣義表作為基本的資料結構,就連程式也表示成一系列的廣義表。 【廣義表的定義及頭尾連結串列

陣列11——稀疏矩陣的壓縮儲存1——基本內容

【定義】 所謂稀疏矩陣,假設在m×n矩陣中,有t個元素不為零,令δ=t/(m×n),δ為矩陣的稀疏因子,如果δ≤0.05,則稱矩陣為稀疏矩陣。通俗的來講,若矩陣中大多數元素的值為零,只有很少的非零元素,這樣的矩陣就是稀疏矩陣。 如圖就是一個稀疏矩陣 【三元組表示】 為了節省

陣列9——陣列的壓縮儲存1——基本內容

【壓縮儲存】 有些高階矩陣中,非零的元素非常少,此時若使用二維陣列將造成儲存空間的浪費,這時,可只儲存部分元素,從而提高儲存空間的利用率。通常的做法是為多個相同值的元素只分配一個儲存單元,對值為零的元素不分配儲存單元。這種儲存方式稱為矩陣的壓縮儲存。我們把非零元素非常少(遠小於m×n)或元素

順序表示佇列——順序佇列4——輪渡管理

【問題】 某汽車輪渡口,過江渡船每次能載10輛車過江。過江車輛分為客車類和貨車類,上船有以下規定:同類車先到先上船,客車先於貨車上渡船,且每上4輛客車,才允許上一輛貨車;若等待貨車不足4輛,則以貨車代替,如果無貨車等待則允許客車都上船。設計一個演算法模擬渡口管理。 【分析】 初始時,上渡船汽車數

順序表示的串——順序串——基本內容

字串、簡稱串,它也是一種重要的線性結構。計算機中處理的大部分資料都是字串資料,例如,學生學籍資訊系統的姓名、性別、家庭住址、院系名稱等資訊都屬於字串資料。串廣泛應用於各種專業的資訊管理、資訊檢索、問答系統、機器翻譯等系統處理中。 【定義】 串(string)是由零個或多個字元組成的有限序

資料結構 順序佇列 迴圈佇列 基本操作

順序佇列基本操作:  #define MAXSIZE 1000 struct queue{ int front ,rear;//表示頭指標和 尾指標 int data[MAXSIZE]; //儲存資料的陣列 } void Initqueue(queue &

3.5.2 迴圈佇列——佇列順序表示和實現

佇列也有兩種表示形式,順序和鏈式。 與順序棧相類似,在佇列的順序儲存結構中,除了用一組地址連續的儲存單元依次存放從佇列頭到佇列尾的元素之外,尚需附設兩個整形變數front和rear分別指示佇列頭元素及佇列尾元素的位置(後面分別稱為頭指標和尾指標)。佇列的順序儲存結構表示如下 //

迴圈佇列----佇列順序表示和實現

1.佇列的順序表示 1)C語言的描述 初始化建空對列時,令front=rear=0,每當插入新的隊尾元素時,“尾指標增1”;每當刪除佇列頭元素時,“頭指標增1”。因此,在非空佇列中,頭指標始終指向佇列頭元素,而尾指標始終指向佇列尾元素的下一位置,如圖所示。 2)存在

佇列——順序儲存結構及其基本運算(迴圈佇列

該文章主要介紹迴圈佇列的順序儲存結構以及相關運算。 標頭檔案:CSqQueue.h template <typename T> class SqQueueClass1 //迴圈佇列類模板 { T *data; //存放隊中元素 int fr

佇列順序表示和實現

和順序棧相類似,在佇列的順序儲存結構中,除了用一組地址連續的儲存單元依次存放從佇列頭到佇列尾的元素之外,尚需附設兩個指標front和rear分別指示佇列頭元素和佇列尾元素的位置。為了在C語言中描述方便

佇列順序表示形式和實現

佇列 的順序表示是用一組地址連續的儲存單元依次存放佇列中的   各個元素,並用指標front指向隊頭,指標rear指向隊尾。   一般約定:front指標始終指向隊頭元素,而rear指標是指向隊尾   元素的下一個位置。 假溢位:當隊滿的時候,若還有元素進隊,rear指標將

資料結構學習之路4 佇列基本操作(順序儲存的迴圈佇列+連結串列實現)

佇列先進先出,這裡用了順序(陣列)和鏈式兩種方式實現,下次再用鏈式儲存實現以下堆疊試試 迴圈佇列: //順序儲存結構的迴圈佇列 #include<iostream> using namespace std; #define MAXSIZE 100 typedef

資料結構之佇列順序表示及其實現(迴圈佇列

記錄一下自己學習過程中寫的程式碼。以下是我看嚴蔚敏老師的資料結構教材後,結合教材所講用C語言實現了關於佇列的順序表示及其實現的基本操作,供以後複習所用。和順序棧類似,在佇列的順序儲存結構中,除了用一組地址連續的儲存單元一次存放從隊頭到隊尾的元素之外,尚需附設隊頭指標Fron

數據結構—線性表的順序表示(1)

練習 考研 存儲 reat 數據結構 來源 log eat pau 題目來源於王道2018數據結構考研復習指導線性表的綜合練習 編譯環境:VS2015 題目:從順序表中刪除具有最小值的元素(假設唯一),並由函數返回被刪元素的值。空出的位置由最後一個元素填補,若順序表為空,則

訊息佇列順序

訊息佇列順序 https://www.cnblogs.com/LipeiNet/p/9877189.html 訊息佇列總結 前言:關於訊息佇列應該大家都不陌生,在實際的專案中訊息佇列也無處不在,今天我和大家分享一下關於訊息佇列的問題。 1、訊息佇列定義 訊息佇列大家又經常稱為MQ(message que

c# 多執行緒使用佇列順序寫日誌的類 (需要再優化)

using System; using System.Collections.Generic; using System.Threading; public class LogManager { /// <summary> /// 建構函式 /// </su

資料結構-佇列-順序表實現-C語言

佇列定義 對於一個存取的n個內容,最先進入的最先出去(First In,First Out:FIFO),即稱為佇列. 比如,食堂排隊,最先去的,最先得到飯菜; 關鍵步驟:入隊出隊 程式碼實現 //迴圈佇列 順序表實現 #include <stdio

順序表示的串——順序串2——串的基本操作

利用串的基礎運算,對串進行賦值、比較、插入、刪除、連線等操作。 【分析】 主要考察串的建立、定位、刪除等操作。 SeqString.h #pragma once #include <iostream> using namespace std; #define MA