佇列的知識講解與基本實現(資料結構)

2022-01-10 09:23:41 字數 3905 閱讀 3907

中午在食堂打飯,真是乙個令人頭疼的事情,去食堂的路上也總是步伐匆匆,為什麼啊,這還用說,遲一點去,你就會知道什麼叫做人山人海了,在食堂排隊的時候,相比較學生來說,打飯阿姨畢竟是少數,在每個視窗都有人的時候,不免我們就得等待,直到前面的乙個學生打完飯離開,後面排隊的人才可以繼續向前走,直到輪到自己,別提多費勁了,但是秩序和規則卻是我們每個人都應該遵守的,也只能抱怨自己來的遲了

這種 「先進先出」 的例子就是我們所講的基本資料結構之一 」佇列「

例子補充:用電腦的時候,有時候機器會處於疑似宕機的狀態, 滑鼠點什麼似乎都沒有用,雙擊任何快捷方式都不動,就當你失去耐心,打算reset的時候,突然它就像酒醒了一樣,把你剛才點選的所有操作全部按照順序執行了一遍,這其實是因為作業系統中的多個程式隱需要通過乙個通道輸出,而按照先後次序排隊等待造成的 ——《大話資料結構》

定義:佇列是一種只允許在一段進行刪除操作,在另一端進行插入操作的線性表

允許插入的一段稱作隊尾 (rear),允許刪除的的一端稱為隊頭 (front)

佇列的資料元素又叫做佇列元素,在佇列中插入乙個佇列元素稱為入隊,從佇列中刪除乙個佇列元素稱為出隊 ,也正是因為佇列只允許在一段插入,另一端刪除,所以這也就是我們前面例子中體現出來的先進先出 (fifo-first in first out) 的概念

補充:除此之外,還有的佇列叫做雙端佇列,也就是可以在表的兩邊進行插入和刪除操作的線性表

雙端佇列分類:

輸出受限的雙端佇列:刪除操作限制在表的一段進行,而插入操作允許早表的兩端進行

插入操作限制在表的一段進行,而刪除操作允許在表的兩端進行

#ifndef _queue_h_

#define _queue_h_

#include using namespace std;

// 用於檢查範圍的有效性

class outofrange:public exception

};

// 用於檢查長度的有效性

class badsize:public exception

}; template class queue

};#endif

佇列作為乙個特殊的線性表,自然也有著順序以及鏈式儲存兩種方式,我們先來看看它的順序儲存方式——迴圈佇列

在佇列的順序儲存中,我們除了建立乙個具有一定空間的陣列空間外,還需要兩個指標,分別指向佇列的前端和微端,下面的**中,我們選擇將隊頭指標指向頭元素的前乙個位置,隊尾指標指向隊尾元素(當然這不是唯一的方式,還可以將頭指標指向頭元素,隊尾指標指向隊尾元素的後乙個位置,原理是基本一致的)

為什麼要這麼做,並且為什麼這種儲存我們叫做迴圈佇列?

我們一步步分析一下:

我們先按照我們一般的想法畫出佇列元素進出隊的過程,例如佇列元素出隊

這樣的設想,也就是根據我們前面食堂排隊的例子畫出來的,但是我們可以清晰的看到,當a0出隊後,a0後的元素全部需要前移,將空位補上,但我們在計算機中講究效能二字,如何可以提高出隊的效能呢?

迴圈佇列就這樣被設計出來了,我們如果不再限制隊頭一定在整個空間的最前面,我們的元素也就不需要集體移動了

問題一這個時候我們就需要考慮這樣的問題了:

① 如何為了解決只有乙個元素的時候,隊頭和隊尾重合使得處理變得麻煩?

問題二但是有乙個大問題出現了 !

如果前面有空閒的空間還好說,一旦頭元素前面沒有空間,我們的隊頭指標就指向到了陣列之外,也就會出現陣列越界問題,這該怎麼辦呢?

我們可以看到,雖然我們的表頭已經沒有了任何空間,但是表的後半部分還有空餘空間,這種現象我們稱作假溢位,打個比方,接近上課你緩緩走進教室,看到只有前排剩下了兩個位置,你總不會轉身就走吧,當然可以去前排坐,只有實在沒座位了,才考慮離開

我們可以做出這樣一種比較可行的方案

問題三我們剛才也提到了,當表頭指標和表尾指標相等的時候就解決了空佇列的情況,但是在表滿的情況下,你會發現,同樣也滿足表頭表尾指標相等,那麼又如何解決這個問題呢?(我們給出三種可行的解決方案)

我們重點講解 c 中的方法

我們根據這種方法可以總結出幾個條件的表示式

#ifndef _seqqueue_h_

#define _seqqueue_h_

#include "queue.h"

template class seqqueue:public queue

//清空佇列

void clear()

//判空

bool empty() const

//判滿

bool full() const

//佇列長度

int size() const

//入隊

void enqueue(const t &x);

//出隊

t dequeue();

//取隊首元素

t gethead() const;

}; #endif

template seqqueue::seqqueue(int initsize)
template void seqqueue::enqueue(const t &x)
template t seqqueue::dequeue()
template t seqqueue::gethead() const
template void seqqueue::resize()
用鏈式儲存結構表示佇列我們叫做鏈佇列,用無頭結點的單鏈表表示佇列,表頭為隊頭,表尾為隊尾,需要兩個指標分別指向隊頭元素和隊尾元素,這種儲存結構的好處之一就是不會出現佇列滿的情況

#ifndef _linkqueue_h_

#define _linkqueue_h_

#include #include "queue.h"

template class linkqueue:public queue

node ():next(null){}

~node () {}

}; node *front, *rear;

public:

linkqueue();

~linkqueue()

//清空佇列

void clear();

//判空

bool empty() const

//佇列長度

int size() const;

//入隊

void enqueue(const t &x);

//出隊

t dequeue();

//取隊首元素

t gethead() const;

};#endif

template void linkqueue::clear() 

//修改尾指標

rear = null;

}

template int linkqueue::size() const  

return count;

}

template void linkqueue::enqueue(const t &x) 

}

template t linkqueue::dequeue()
template t linkqueue::gethead() const
在這裡的我們素不相識,卻都在為了自己的夢而努力 ❤

環形佇列的輸出 迴圈佇列的基本操作詳細講解

實驗學時 實驗型別 設計型 一 實驗目的 1.理解並掌握佇列的邏輯結構和順序儲存結構,了解迴圈佇列的特點 2.掌握迴圈佇列中基本操作的相關演算法 3.程式設計實現相關演算法 4.學會利用迴圈佇列解決實際問題。二 實驗條件 visual c 三 實驗原理及相關知識 1.迴圈佇列儲存結構描述 defin...

資料結構的基本概念及佇列與棧的基本實現

一資料結構的基本概念 1 hash表 dict底層結構使用的雜湊表 為了支援快速查詢使用了雜湊表作為底層結構,雜湊表的實現原理,底層其實就是乙個陣列 雜湊表平均查詢時間複雜度o 1 cpython直譯器使用二次探查解決雜湊衝突問題 list與tuple的區別 都是線性結構,支援下標訪問 list沒法...

迴圈佇列的基本實現

2.完成對迴圈佇列結構的定義,以及對迴圈佇列的各種基本運算的實現 每種基本運算用乙個函式來實現 基本運算包括 初始化init sqqueue運算 判隊空empty sqqueue運算 入隊en sqqueue運算 出隊de sqqueue運算 取隊頭元素gethead sqqueue運算。inclu...