隊列的相關(guān)知識與代碼實現(xiàn)

一搭伤、隊列的相關(guān)概念和定義

試想一下弄唧,有的時候電腦像死機一樣,鼠標(biāo)點什么都沒用险毁。而過了一會卻好像酒醒了一樣把你剛才的操作都順序執(zhí)行了一遍制圈。這其實是因為操作系統(tǒng)中的多個程序因需要通過一個通道輸出,而按先后次序排隊等待造成的畔况。這實際上是一種先進先出的思想鲸鹦,我們稱之為隊列
隊列的應(yīng)用非常廣泛:
舉例:鍵盤輸入跷跪,顯示器上記事本軟件的輸出等等馋嗜。。包括操作系統(tǒng)的各種準(zhǔn)備隊列吵瞻,就緒隊列葛菇。甘磨。都是先進先出的典型。
隊列的定義:是只允許在一端進行插入操作眯停,而在另一端進行刪除操作的線性表(First in first out济舆,F(xiàn)IFO,先進先出)莺债。

循環(huán)隊列

隊列作為一個線性表滋觉,也有順序存儲鏈?zhǔn)酱鎯?/strong>兩種方式。
隊列順序存儲的不足

  • 首先齐邦,隊列順序存儲一個固定長度的序列椎瘟,并向其中添加n個元素。若再添加元素只需加到隊尾即可侄旬,時間復(fù)雜度為O(1)肺蔚。
  • 然而,出棧時是隊頭出棧儡羔。因此宣羊,如果下次想再讓隊頭出棧,則需要把所有元素往前移動一位汰蜘,即把下標(biāo)為1的元素移動到下標(biāo)為0的地方仇冯,時間復(fù)雜度為O(n),并且是每次出棧一個元素就要重復(fù)執(zhí)行一次族操。
  • 為避免這種情況苛坚,我們就引入兩個指針front和rear分別指向隊頭和隊尾。令front==rear時色难,隊列為空泼舱。rear指向末尾元素的后面一位。這樣可以避免隊列滿時也會出現(xiàn)front==rear的情況枷莉。

問題1:當(dāng)最后一個元素插到分配地址的末尾娇昙,而前面有空位置,那么rear指針何去何從笤妙?
:再重頭開始冒掌,將rear指針插到最前面的分配的地址空間。
我們將這種隊列稱之為循環(huán)隊列蹲盘。
問題2:rear可能比front大股毫,也可能比front小,那么如何判斷召衔?
:兩者最少相差1的內(nèi)存空間(可能只相差1個位置铃诬,也可能是一圈,看rear在前面還是后面),這個時間我們就判斷是滿了氧急。若隊列的最大尺寸是Queuesize,那么隊列滿了的條件是(rear+1)%Queuesize==front(取模以后就整合了rear與front的大小前后兩個位置各自的問題)毫深。
問題3:隊列長度計算公式:

  • rear>front時吩坝,長度為rear-front。
  • rear<front時哑蔫,分兩段钉寝。第一段為Queuesize-front,第二段為0+rear闸迷,合起來就是rear-front+Queuesize嵌纲。
    因此通用計算長度為(rear-front+Queuesize)%Queuesize。

注意:此為順序存儲結(jié)構(gòu)的方法腥沽。

鏈?zhǔn)疥犃?/h4>

鏈?zhǔn)疥犃袑嶋H上就是線性表的單鏈表逮走,只不過它只能尾進頭出而已。尾進就用尾插法今阳,頭出可以參考一下棧的Pop()函數(shù)师溅。
此時,rear沒有必要空出一個元素盾舌,因為鏈?zhǔn)疥犃写鎯臻g一般是用不完的墓臭,除非內(nèi)存已滿。

二妖谴、隊列的代碼實現(xiàn)

循環(huán)隊列

//SeqQueue.h

#ifndef SEQQUEUE_H_
#define SEQQUEUE_H_
const int Queuesize = 10;
class SeqQueue
{
private:
    int num[Queuesize];
    int front;
    int rear;
public:
    SeqQueue();
    ~SeqQueue();
    void EnQueue(int e);
    void DeQueue();
    int length();
    void Print();
};
#endif

//SeqQueue.cpp

#include<iostream>
#include"SeqQueue.h"
using std::cout;
using std::endl;
SeqQueue::SeqQueue()
{
    front = rear = 0;
}
SeqQueue::~SeqQueue()
{
}
void SeqQueue::EnQueue(int e)
{
    if((rear+1)%Queuesize == front)//判斷是否為滿隊列
        return;
    num[rear] = e;//把尾部加上元素
    rear = (rear+1)%Queuesize;//尾部向后一位
}
void SeqQueue::DeQueue()
{
    if(front == rear)//判斷是否為空隊列
        return;
    front = (front+1)%Queuesize;//front向后一位
}
int SeqQueue::length()
{
    return (rear-front+Queuesize)%Queuesize;
}
void SeqQueue::Print()
{
    for (int i=front;i!=rear;i=(i+1)%Queuesize)
    {
        cout << num[i] << " ";
    }
    cout << endl;
    cout << "Length: " << length() << endl;
}

//Test.cpp

#include<iostream>
#include"SeqQueue.h"
using namespace std;
int main()
{
    SeqQueue S;
    for (int i=0;i<5;i++)
    {
        S.EnQueue(i);
        S.Print();
    }
    for (int i=0;i<2;i++)
    {
        S.DeQueue();
        S.Print();
    }
    return 0;
}

輸出結(jié)果:

輸出結(jié)果.png

鏈?zhǔn)疥犃谢貋碓傺a窿锉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市膝舅,隨后出現(xiàn)的幾起案子嗡载,更是在濱河造成了極大的恐慌,老刑警劉巖仍稀,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鼻疮,死亡現(xiàn)場離奇詭異,居然都是意外死亡琳轿,警方通過查閱死者的電腦和手機判沟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崭篡,“玉大人挪哄,你說我怎么就攤上這事×鹕粒” “怎么了迹炼?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我斯入,道長砂碉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任刻两,我火速辦了婚禮增蹭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘磅摹。我一直安慰自己滋迈,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布户誓。 她就那樣靜靜地躺著饼灿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪帝美。 梳的紋絲不亂的頭發(fā)上碍彭,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音悼潭,去河邊找鬼硕旗。 笑死,一個胖子當(dāng)著我的面吹牛女责,可吹牛的內(nèi)容都是我干的漆枚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼抵知,長吁一口氣:“原來是場噩夢啊……” “哼墙基!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刷喜,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤残制,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后掖疮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體初茶,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年浊闪,在試婚紗的時候發(fā)現(xiàn)自己被綠了恼布。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡搁宾,死狀恐怖折汞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盖腿,我是刑警寧澤爽待,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布损同,位于F島的核電站,受9級特大地震影響鸟款,放射性物質(zhì)發(fā)生泄漏膏燃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一何什、第九天 我趴在偏房一處隱蔽的房頂上張望组哩。 院中可真熱鬧,春花似錦富俄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至暴备,卻和暖如春悠瞬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涯捻。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工浅妆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人障癌。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓凌外,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涛浙。 傳聞我的和親對象是個殘疾皇子康辑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容