新聞中心

labview棧和隊(duì)列

作者: 時(shí)間:2017-01-09 來源:網(wǎng)絡(luò) 收藏

同步控制技術(shù)----棧與隊(duì)列

本文引用地址:http://butianyuan.cn/article/201701/337150.htm

(其中有很多圖片不是馬上就能看到的,查看方法是:鼠標(biāo)右擊不可看圖片,選擇復(fù)制圖片地址,然后在瀏覽器中打開即可。因?yàn)楸疚氖钦浀模o各位朋友帶來不便,請(qǐng)多諒解!)

在計(jì)算機(jī)編程中棧是一個(gè)很重要的概念,尤其在匯編語言中,需要不斷進(jìn)棧和出棧的操作.棧是限定在一個(gè)表的尾端進(jìn)行插入(進(jìn)堆棧)和刪除(出堆棧)的線性表.是后進(jìn)先出結(jié)構(gòu)(LIFO).

隊(duì)列的定義和棧的定義是類似的,區(qū)別是數(shù)據(jù)是先進(jìn)先出(FIFO)

labview還有一個(gè)概念緩沖區(qū)BUFFER,典型的比如CHART,它默認(rèn)保存數(shù)據(jù)長度是1024.BUFFER的概念和隊(duì)列是非常相似的,都是一個(gè)先進(jìn)先出的結(jié)構(gòu).如果我們?cè)O(shè)定隊(duì)列的數(shù)據(jù)長度也是1024.比較一下他們的區(qū)別.

區(qū)別一:未達(dá)到設(shè)定

開始的時(shí)候,隊(duì)列和緩沖區(qū)中都是沒有數(shù)據(jù)的,當(dāng)有數(shù)據(jù)進(jìn)入的時(shí)候,隊(duì)列和緩沖區(qū)中的數(shù)據(jù)在不斷地增加,對(duì)于緩沖區(qū),因?yàn)槲催_(dá)到它最大許可的長度 1024,因此數(shù)據(jù)是不斷第增加的,隊(duì)列則不同,它的數(shù)據(jù)是否增加取決于是否有讀隊(duì)列的過程,就是所說的出隊(duì),如果出隊(duì)的速度大于入隊(duì)的速度,隊(duì)列中則根本不會(huì)有數(shù)據(jù).如果沒有出隊(duì)的過程或者出隊(duì)的速度小于入隊(duì)的過程,隊(duì)列中的數(shù)據(jù)也是不斷地增加的.這是第一個(gè)區(qū)別.

區(qū)別二:到達(dá)設(shè)定值

當(dāng)隊(duì)列和BUFFER都達(dá)到了1024個(gè)數(shù)據(jù)后,這是再有新的數(shù)據(jù)要進(jìn)來,隊(duì)列和BUFFER的表現(xiàn)是不同的,對(duì)于BUFFER,它將自動(dòng)擠出(形象的說法,當(dāng)然也是編程實(shí)現(xiàn)的)最早進(jìn)入BUFFER的數(shù)據(jù),所謂先進(jìn)先出.而隊(duì)列則不同.要求進(jìn)入隊(duì)列的線程只能被動(dòng)等待,一直到隊(duì)列中有別的線程取出數(shù)據(jù),隊(duì)列中有空閑位置.所以隊(duì)列有調(diào)節(jié)讀寫速度線程的能力.

相同點(diǎn)一:數(shù)據(jù)進(jìn)入都是在尾部,(隊(duì)列插入如果在頭部,就編程上面所說的棧了)

相同點(diǎn)二:對(duì)于中間數(shù)據(jù)都實(shí)現(xiàn)了有效的封裝,你無法直接提取中間的某個(gè)數(shù)據(jù),你可以讀出中間的數(shù)據(jù),但是不能改變當(dāng)前BUFFER和隊(duì)列的值.

LABVIEW提供的隊(duì)列的功能函數(shù)(包括棧),在逐點(diǎn)分析庫提供了DBL型的BUFFER,我在另外的日志中專門提到了,這里就不多說了.

LV隊(duì)列的函數(shù)是基本函數(shù),無法進(jìn)行深入跟蹤,估計(jì)應(yīng)該是采用C++的算法然后封裝的,我實(shí)際測(cè)試過,它的運(yùn)行效率遠(yuǎn)高于用數(shù)組的方式構(gòu)成的隊(duì)列,為了詳細(xì)說明隊(duì)列和棧的細(xì)節(jié),我還是用數(shù)組的形式,然后在介紹LV的隊(duì)列函數(shù).

首先看看如何用數(shù)組實(shí)現(xiàn)棧的功能:

棧的操作是非常簡(jiǎn)單的,只有壓棧和出棧兩個(gè)操作(PUSH AND POP)

我們用AE來實(shí)現(xiàn)它.分成三個(gè)action: Init,Push ,Pop

首先嚴(yán)格自定義ENUM,表示三個(gè)動(dòng)作.

這樣我們就完成了棧的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

運(yùn)行結(jié)果確實(shí)如此。

與棧相反,隊(duì)列是一個(gè)先入先出的數(shù)據(jù)結(jié)構(gòu),我們對(duì)棧的過程稍微修改一下,就可以得到隊(duì)列。就不多介紹了。

下面重點(diǎn)介紹一下LV提供的隊(duì)列的具體功能。

分別介紹這8個(gè)節(jié)點(diǎn)的具體功能:
1:獲得隊(duì)列(實(shí)際是得到隊(duì)列的參考)它有5個(gè)數(shù)據(jù)端子

name:String
隊(duì)列在LV系統(tǒng)中是名稱來區(qū)分的,LV系統(tǒng)自己維護(hù)一個(gè)包含的目前所有隊(duì)列的表,當(dāng)你運(yùn)行這個(gè)函數(shù)的時(shí)候,它首先會(huì)查找表中是否已經(jīng)存在這個(gè)隊(duì)列參考,如果存在,就直接返回這個(gè)參考,如果不存在,就建立一個(gè)新的隊(duì)列,并將隊(duì)列參考加入表中進(jìn)行維護(hù)。這樣做的好處是非常明顯的,允許我們?cè)谌魏巫覸I中,只需要知道隊(duì)列的名稱就可以運(yùn)行這個(gè)函數(shù)直接得到隊(duì)列參考,不用通過全局變量或者數(shù)據(jù)流輸入來得到參考,在一個(gè)層層嵌套的VI中想傳遞一個(gè)數(shù)據(jù)很不容易,也不利于模塊化。

上一頁 1 2 下一頁

關(guān)鍵詞: labview棧隊(duì)

評(píng)論


技術(shù)專區(qū)

關(guān)閉