1、隊列的原理和作用
1、1 隊列的原理
? ? ? ? 隊列的原理其實就像一個管道,如果我們不斷的往管道里塞乒乓球,每個乒乓球在管道里就會排列一條隊列,先進去的乒乓球會先出來,這個就是隊列先進先出的規則
? ? ? ? 球從左邊進去的動作叫入列,然后進去的球在管道里排成一個隊列,這個叫隊列緩存,說白了就類似于一個數組,那么存了五個球就相當于是buff[5];這樣的意思,從最右邊出來的球也是進去最早的球,這個動作也叫出列,所以遵循了先進先出的規則
1、2 隊列的作用
? ? ? ? 隊列最主要的作用就是用來緩存數據,比方說串口接收數據,我們一般定義一個數組來存儲數據,但是假如串口數據頻率很快,可能這個數組里存儲的數據還沒處理完,下一組數據又過來了,那么這時候數組里的數據就會被新數據覆蓋,導致老數據丟失,像這樣就可以通過隊列的方式來處理,每收到一個字節的數據都先入列,然后在應用程序同步解析處理,根據先進先出的規則那么老的數據就不會被新的數據覆蓋了
? ? ? ? 基于這樣的緩存數據的技術,可以靈活應用在各種場景,例如說大數據處理,操作系統的消息傳遞等等
2、隊列程序的設計思路
? ? ? ? 其實實現隊列的方法有很多種,但是工作原理都是一樣的,我們要編寫代碼,首先要很清楚隊列的工作原理,那么我們這里總結隊列的三個核心關鍵點:
1、隊列緩存
2、入列
3、出列
? ? ? ? 一個隊列是不是基本需要這三個必要的操作,那么隊列緩存很好理解,就是定義一個數組,數組大小就是隊列緩存的大小,入列就是把一個或若干數據按照順序存到隊列緩存數組里,同樣出列就是把數據從隊列緩存里按順序取出來,那么原理我們懂了,接下來思考一個問題,入列和出列怎么用程序實現
2、1 入列操作
? ? ? ? 根據我們前面的理論,入列其實就是把數據存進數組的操作,我們平時存數組一般都是buff[0]=i;這種操作,那么入列其實也沒那么簡單,因為要考慮隊列里當前存在多少個數據的情況,如果有數據,那么我們就不能從[0]這個下標開始入列,所以我們在入列時要考慮兩個問題
1、隊列緩存可以存儲的數組下標位置,我們這個一般稱為隊尾
2、隊列是否已滿,如果隊列緩存滿了又有新的數據入列,該怎么處理?這里我們一般處理方式是按照時間順序,把最早入列的數據丟棄,以新的數據替換
????????那么第二個問題我們先暫時不管,我們來看第一個問題,我們前面的課程學過數組與指針,通過指針的特性,我們在用一個指針變量表示隊尾,然后通過這個隊尾指針指向隊列緩存數組的首地址,當入列一個數據時,我的隊尾指針就加1,這樣就能知道當前隊列緩存的可存儲位置地址了
2、2 出列操作
? ? ? ? 數據入列以后自然要取出來,那么我們取的時候呢也是有原則的,不能亂取,而是從最早入列那個數據的地址開始取,所以這個出列的數組下標我們稱為隊頭,同樣的我們可以使用指針變量來代表隊頭
? ? ? ? 我們看下下面這個圖是一個出列的流程,我們這個是滿編隊的隊列,總共有五個數據,那么隊頭指針指向隊列緩存首地址,接著第一個出列的就是數據1,出列后隊頭指針+1,就指向了數據2的地址,那么數據2出列后,隊頭指針又+1,以此類推,就能實現先進先出的操作
????????