專利名稱:一種循環(huán)隊列的數(shù)據(jù)存儲方法
技術領域:
本發(fā)明涉及軟件技術領域,尤其涉及一種循環(huán)隊列的數(shù)據(jù)存儲方法。
背景技術:
如圖1所示隊列(queue)是一種先進先出(first in first out,縮寫為FIFC)的線性表,它只允許在表的一端進行插入,而在另一端刪除元素。在隊列中允許插入的一端叫做隊尾(rear),允許刪除的一端則稱為隊頭(front)。對于循環(huán)隊列,在隊列的順序存儲結(jié)構(gòu)中,除了用一組地址連續(xù)的存儲單元依次存放從隊列頭到隊列尾的元素之外,尚需附設兩個指針q_front和q_rear分別指示隊列頭元素及隊列尾元素的位置。
在C語言中,初始化建空隊列時,令q_front=q_rear=0,每當插入新的隊列尾元素時,“尾指針增1”;每當刪除隊列頭元素時,“頭指針增1”。因此,在非空隊列中,頭指針時鐘指向隊列頭元素,而尾指針始終指向隊列尾元素的下一個位置。
隊列尾元素不停插入,當隊列尾指針追上隊列頭指針時,則隊列空間均被占滿,此時q_front==q_rear,當隊列中的元素相繼從隊列中刪除,隊列呈空狀態(tài),此時也存在關系式q_front==q_rear,由此可見,只憑等式q_front==q_rear無法判別隊列空間是“滿”還是“空”。為解決這個問題,有以下三種常用方法1、另設一個標志位已區(qū)別隊列是“滿”還是“空”;這種方法的缺點是多用了一個變量。
2、以q_front==q_rear為隊列空的判斷依據(jù);這種方法的缺點是當隊列尾指針追上隊列頭指針時,將會丟失隊列全部的元素。
3、以隊列頭指針在隊列尾指針的下一個位置上,作為隊列呈“滿”狀態(tài)的標志;這種方法的缺點是當隊列滿時,新元素將被丟掉,當新元素有效性大于舊元素時,則不滿足刪除舊元素,儲存新元素的需求。
發(fā)明內(nèi)容
本發(fā)明的目的是提供一種循環(huán)隊列的數(shù)據(jù)存儲方法,不使用額外的變量標志隊列的狀態(tài);便可保證當隊列尾指針追上頭指針時,保存新數(shù)據(jù),刪除舊數(shù)據(jù)。
本發(fā)明的目的是通過以下技術方案實現(xiàn)的一種循環(huán)隊列的數(shù)據(jù)存儲方法,包括在循環(huán)隊列存儲數(shù)據(jù)過程中,將新的數(shù)據(jù)元素從隊尾插入隊列尾指針指向的循環(huán)隊列中,同時將隊列尾指針加1;且當隊列尾指針等于隊列頭指針時,將隊列頭指針加1。
所述的方法包括在循環(huán)隊列存儲數(shù)據(jù)過程中,判斷隊列尾指針是否等于隊列頭指針,如是,將隊列頭指針加1。
由上述本發(fā)明提供的技術方案可以看出,本發(fā)明所述的循環(huán)隊列的數(shù)據(jù)存儲方法在循環(huán)隊列存儲數(shù)據(jù)過程中,將新的數(shù)據(jù)元素從隊尾插入隊列尾指針指向的循環(huán)隊列中,同時將隊列尾指針加1;且當隊列尾指針等于隊列頭指針時,將隊列頭指針加1。這一過程在執(zhí)行時需判斷隊列尾指針是否等于隊列頭指針,如是,將隊列頭指針加1,否則,不進行任何操作。
圖1為隊列的示意圖;圖2為本發(fā)明提供的一種循環(huán)隊列的數(shù)據(jù)存儲方法的流程圖。
具體實施例方式
本發(fā)明的核心是在循環(huán)隊列存儲數(shù)據(jù)過程中,將新的數(shù)據(jù)元素從隊尾插入隊列尾指針指向的循環(huán)隊列中,同時將隊列尾指針加1;且當隊列尾指針等于隊列頭指針時,將隊列頭指針加1。這一過程在執(zhí)行時需判斷隊列尾指針是否等于隊列頭指針,如是,將隊列頭指針加1,否則,不進行任何操作。具體的過程如圖2所示步驟21、系統(tǒng)將新的數(shù)據(jù)元素從隊尾插入隊列尾指針指向的循環(huán)隊列中;步驟22、系統(tǒng)將隊列尾指針加1;步驟23、判斷隊列尾指針是否等于隊列頭指針,如是,執(zhí)行步驟24。否則,不進行任何操作,繼續(xù)判斷。
步驟24、系統(tǒng)將隊列頭指針加1。
這時當新的數(shù)據(jù)元素從隊尾插入,最新的元素覆蓋了最舊的元素。以下是實例說明#define MAX_QUEUE_SIZE 100 //最大隊列長度//定義一個隊列unsigned char queue[MAX_QUEUE_SIZE];unsigned char q_front;unsigned char q_rear;//初始化隊列
q_front=q_rear=0;//刪除元素時隊列頭指針的算法q_front=(++q_front)%MAX_QUEUE_SIZE;//插入元素時隊列指針的算法q_rear=(++q_rear)%MAX_QUEUE_SIZE;if(q_rear==q_front)q_front=(++q_front)%MAX_QUEUE_SIZE;可見,本發(fā)明在節(jié)省隊列狀態(tài)變量、隊列新元素有效性大于舊元素及最少丟失數(shù)據(jù)的前提下,提供了一種新的隊列狀態(tài)的表示方法。
以上所述,僅為本發(fā)明較佳的具體實施方式
,但本發(fā)明的保護范圍并不局限于此,任何熟悉本技術領域的技術人員在本發(fā)明揭露的技術范圍內(nèi),可輕易想到的變化或替換,都應涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應該以權(quán)利要求的保護范圍為準。
權(quán)利要求
1.一種循環(huán)隊列的數(shù)據(jù)存儲方法,其特征在于,包括在循環(huán)隊列存儲數(shù)據(jù)過程中,將新的數(shù)據(jù)元素從隊尾插入隊列尾指針指向的循環(huán)隊列中,同時將隊列尾指針加1;且當隊列尾指針等于隊列頭指針時,將隊列頭指針加1。
2.根據(jù)權(quán)利要求1所述的循環(huán)隊列的數(shù)據(jù)存儲方法,其特征在于,所述的方法包括在循環(huán)隊列存儲數(shù)據(jù)過程中,判斷隊列尾指針是否等于隊列頭指針,如是,將隊列頭指針加1。
全文摘要
本發(fā)明所述的循環(huán)隊列的數(shù)據(jù)存儲方法在循環(huán)隊列存儲數(shù)據(jù)過程中,將新的數(shù)據(jù)元素從隊尾插入隊列尾指針指向的循環(huán)隊列中,同時將隊列尾指針加1;且當隊列尾指針等于隊列頭指針時,將隊列頭指針加1。這一過程在執(zhí)行時需判斷隊列尾指針是否等于隊列頭指針,如是,將隊列頭指針加1,否則,不進行任何操作。
文檔編號G06F9/44GK101034346SQ20061005735
公開日2007年9月12日 申請日期2006年3月10日 優(yōu)先權(quán)日2006年3月10日
發(fā)明者李敬東 申請人:北京佳訊飛鴻電氣有限責任公司