labview棧和隊列
同步控制技術(shù)----棧與隊列 本文引用地址:http://m.butianyuan.cn/article/201701/337150.htm(其中有很多圖片不是馬上就能看到的,查看方法是:鼠標(biāo)右擊不可看圖片,選擇復(fù)制圖片地址,然后在瀏覽器中打開即可。因為本文是摘錄的,給各位朋友帶來不便,請多諒解!) |
在計算機編程中棧是一個很重要的概念,尤其在匯編語言中,需要不斷進棧和出棧的操作.棧是限定在一個表的尾端進行插入(進堆棧)和刪除(出堆棧)的線性表.是后進先出結(jié)構(gòu)(LIFO). 隊列的定義和棧的定義是類似的,區(qū)別是數(shù)據(jù)是先進先出(FIFO) labview還有一個概念緩沖區(qū)BUFFER,典型的比如CHART,它默認(rèn)保存數(shù)據(jù)長度是1024.BUFFER的概念和隊列是非常相似的,都是一個先進先出的結(jié)構(gòu).如果我們設(shè)定隊列的數(shù)據(jù)長度也是1024.比較一下他們的區(qū)別. 區(qū)別一:未達到設(shè)定 開始的時候,隊列和緩沖區(qū)中都是沒有數(shù)據(jù)的,當(dāng)有數(shù)據(jù)進入的時候,隊列和緩沖區(qū)中的數(shù)據(jù)在不斷地增加,對于緩沖區(qū),因為未達到它最大許可的長度 1024,因此數(shù)據(jù)是不斷第增加的,隊列則不同,它的數(shù)據(jù)是否增加取決于是否有讀隊列的過程,就是所說的出隊,如果出隊的速度大于入隊的速度,隊列中則根本不會有數(shù)據(jù).如果沒有出隊的過程或者出隊的速度小于入隊的過程,隊列中的數(shù)據(jù)也是不斷地增加的.這是第一個區(qū)別. 區(qū)別二:到達設(shè)定值 當(dāng)隊列和BUFFER都達到了1024個數(shù)據(jù)后,這是再有新的數(shù)據(jù)要進來,隊列和BUFFER的表現(xiàn)是不同的,對于BUFFER,它將自動擠出(形象的說法,當(dāng)然也是編程實現(xiàn)的)最早進入BUFFER的數(shù)據(jù),所謂先進先出.而隊列則不同.要求進入隊列的線程只能被動等待,一直到隊列中有別的線程取出數(shù)據(jù),隊列中有空閑位置.所以隊列有調(diào)節(jié)讀寫速度線程的能力. 相同點一:數(shù)據(jù)進入都是在尾部,(隊列插入如果在頭部,就編程上面所說的棧了) 相同點二:對于中間數(shù)據(jù)都實現(xiàn)了有效的封裝,你無法直接提取中間的某個數(shù)據(jù),你可以讀出中間的數(shù)據(jù),但是不能改變當(dāng)前BUFFER和隊列的值. LABVIEW提供的隊列的功能函數(shù)(包括棧),在逐點分析庫提供了DBL型的BUFFER,我在另外的日志中專門提到了,這里就不多說了. LV隊列的函數(shù)是基本函數(shù),無法進行深入跟蹤,估計應(yīng)該是采用C++的算法然后封裝的,我實際測試過,它的運行效率遠高于用數(shù)組的方式構(gòu)成的隊列,為了詳細(xì)說明隊列和棧的細(xì)節(jié),我還是用數(shù)組的形式,然后在介紹LV的隊列函數(shù). 首先看看如何用數(shù)組實現(xiàn)棧的功能: 棧的操作是非常簡單的,只有壓棧和出棧兩個操作(PUSH AND POP) 我們用AE來實現(xiàn)它.分成三個action: Init,Push ,Pop 首先嚴(yán)格自定義ENUM,表示三個動作. |
這樣我們就完成了棧的AE的制作過程。
看看它的調(diào)用過程。
10次循環(huán),棧中的數(shù)據(jù)應(yīng)該是0,1,2,3,4,5,6,7,8,9。棧的彈出次序應(yīng)該是9,8,7,6,5,4,3,2,1,0
運行結(jié)果確實如此。
與棧相反,隊列是一個先入先出的數(shù)據(jù)結(jié)構(gòu),我們對棧的過程稍微修改一下,就可以得到隊列。就不多介紹了。下面重點介紹一下LV提供的隊列的具體功能。
分別介紹這8個節(jié)點的具體功能:
1:獲得隊列(實際是得到隊列的參考)它有5個數(shù)據(jù)端子
name:String
隊列在LV系統(tǒng)中是名稱來區(qū)分的,LV系統(tǒng)自己維護一個包含的目前所有隊列的表,當(dāng)你運行這個函數(shù)的時候,它首先會查找表中是否已經(jīng)存在這個隊列參考,如果存在,就直接返回這個參考,如果不存在,就建立一個新的隊列,并將隊列參考加入表中進行維護。這樣做的好處是非常明顯的,允許我們在任何子VI中,只需要知道隊列的名稱就可以運行這個函數(shù)直接得到隊列參考,不用通過全局變量或者數(shù)據(jù)流輸入來得到參考,在一個層層嵌套的VI中想傳遞一個數(shù)據(jù)很不容易,也不利于模塊化。
評論