手把手教你c语言队列实现代码,通俗易懂超详细!
大家好,我是無際。
近期我們無際單片機編程分享的高級程序架構教程受到了很多粉絲們的高度好評和認可。
這個教程只要用心看的都能體會到里面巨大的價值,特別是工作經驗在2-3年的。
我們整個教程里面有一章節是手把手教大家去寫一個隊列算法。
那今天我把這節課的內容以文章的形式分享出來,方便大家靈活去學習。
一、通過這篇文章你能掌握以下知識:
二、隊列的原理和作用
1.隊列原理
隊列原理其實就像一個管道,如果我們不斷往管道里面塞乒乓球,每個乒乓球在管道里就會排成一條隊形。
先進去的乒乓球就會先出來,這個就是隊列里先進先出的規則。我們看下這個圖
球從左邊進去,進去的動作叫入列。
然后進去的球在管道里排成一個隊列,這個叫隊列緩存,說白了就是數組,那么這里存了5個球就相當于是buff[5]。
最右邊出來的1號球是最早進去的球,這個出來的動作叫出列,所以遵循
了先進先出的規則。
2.隊列作用
隊列最主要的作用啊是用來管理數據流的,防止數據因為傳輸頻率過快得不到及時處理而丟失。
比方說串口接收數據,我們一般定義一個數組來存儲數據,但是數組存儲程序寫起來沒那么方便,需要有一些變量來記錄數組當前可存儲的下標,移植性各方面性能都比較差。
假如串口數據頻率很快,可能這個數組里存儲的數據還沒處理完,下一組串口數據又過來了,那么這時候數組里的數據就會被新數據覆蓋,導致老的數據丟失。
這就是實際產品開發當中會經常碰到的一些痛點。
所以需要一種技術或者算法去解決這個問題,把實現能解決這些痛點的代碼更好地封裝起來,同時保證很好的移植性和可擴展性、還有靈活性。
這個時候隊列算法就派上用場了。
像這種就可以通過隊列的方式來處理,每收到一個字節數據都先入列,然后在應用程序同步解析處理,根據隊列先進先出的規則,那么老的數據就不會被新的數據“插隊”了。
這里只是說出了隊列的其中一個應用,實際上隊列的作用還有非常多,比如可以用來傳遞信號,參數等等。
更多的實用性應用可以跟無際單片機編程從實際產品中去學習。
三、隊列程序設計思路
其實實現隊列的方法有很多種,不同的工程師實現的代碼不一樣。
但是原理都是一樣的,我們要編寫代碼,首先要很清楚隊列的工作原理,這個我們上面已經講了,那么我們這里來總結隊列的3個核心關鍵點:
1.隊列緩存
2.入列
3.出列
一個隊列是不是基本需要這3個必要的操作?
1.隊列緩存
那么隊列緩存很好理解,說白了就是直接定義一個數組,數組大小就是隊列緩存的大小。
數組越大,隊列緩存就越大,能存儲的數據就越多,數據傳輸也越穩定。
入列就是把1個或若干個數據按順序存到隊列緩存數組里,同樣出列把數據從隊列緩存里取出來。
入列和出列的原理懂了,那么我們接下來就要思考一個大家最關心的問題:入列和出列怎么用程序來實現呢?
2.入列
根據我們前面的理論,入列其實就是把數據存進數組的操作,我們平時存數組一般都是buff[0]=1;這樣操作。
那么入列其實沒那么簡單,因為要考慮隊列緩存里面當前存了多少個數據的情況。
如果有數據,那么我們就不能從[0]這個下標開始入列,所以我們在入列時要考慮2個問題:
.①隊列緩存可以存儲的數組下標位置,這個我們一般稱為隊尾。
②隊列是否已滿,如果隊列緩存滿了又有新的數據入列,該怎么處理?這里我們一般處理方式是按照時間順序,把最早入列的數據丟棄,以新的數據替換。
那么第2個問題呢我們暫時先不管,我們來看下第1個問題。
我們前面的文章學過數組與指針,通過指針的特性,我們在用1個指針變量來代表隊尾指針,初始化的時候這個隊尾指針指向隊列緩存數組的首地址。
當入列1個數據時,我的隊尾指針就加1,這樣是不是就能夠知道當前隊列緩存的存儲可位置地址了?
2.出列
數據入列以后自然要取出來,那么我們取的時候呢也是有原則的,不能亂取,而是從最早入列那個數據的地址開始取。
所以這個出列的數組下標我們稱為隊頭指針,同樣的我們可以使用指針變量來代表隊頭。
上圖是一個出列的流程,我們這個是滿編隊的隊列。
總共有1,2,3,4,5個數據,那么隊頭指針指向隊列緩存首地址,接著第一個出列的就是數據1。
出列后對頭指針加1,就指向了數據2的地址,那么數據2出列后,對頭指針又加1,指向數據3的地址,以此類推,這樣就能實現先進先出的原則。
三、隊列算法代碼編寫
1.定義隊列對象
大家發現了沒,不管是入列、還是出列,這些操作都是基于隊列這個對象來操作的。
所以,我們先要把隊列當做一個對象給定義出來:
通過結構體來封裝一個對象再合適不過了。
一個隊列的結構體包含3個東西:隊頭指針、隊尾指針、隊列緩存。
當然,這個隊列緩存還可以根據你的實際產品應用定義不同的大小。
2.入列算法
入列算法根據前面的理論部分編寫,代碼經過了批量產品的驗證。
這里就不詳細解釋了,有配套的視頻講解的更詳細,要的可以找無際單片機編程獲取。
入列和出列之前必須注意要進入臨界和退出臨界。
進入臨界的意思就是把單片機的總中斷關閉,退出臨界就是恢復進入臨界之前的中斷狀態。
3.出列算法
大家如果仔細看,不管是入列還是出列,都是對結構體的成員進行操作。
所以,c語言玩到后面真的也就是面向對象的編程思維。
那出列對應的講解我們也有配套視頻,這里就不再重復了,免得大家看得頭疼。
4.其他注意
在使用隊列前,一定要把隊頭指針和隊尾指針指向隊列緩存第一個元素的地址,否則會引起程序崩潰。
四、掌握隊列在產品中的應用
1.我現在做串口數據流接收基本都會用
2.傳遞重要消息(數據)的時候
還有其他的這里就不多說了,等大家學會了以后自然能擴展更多應用。
總結
以上是生活随笔為你收集整理的手把手教你c语言队列实现代码,通俗易懂超详细!的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: ps如何裁剪掉图片的不规则区域
- 下一篇: 对抗样本之FGSM原理coding
