循環隊列

什么是隊列?

隊列(Queue)也是一種運算受限的線性表。它僅僅同意在表的一端進行插入,而在還有一端進行刪除。同意刪除的一端稱為隊頭(front),同意插入的一端稱為隊尾(rear)

FIFO原則

隊列具有先進先出原則,與棧的先進后出形成對照。

為什么設計循環隊列?

隊列的順序存儲結構稱為順序隊列,順序隊列實際上是運算受限的順序表,和順序表一樣,順序隊列也是必須用一個向量空間來存放當前隊列中的元素。

入隊,出隊操作原理

因為隊列的隊頭和隊尾的位置是變化的,因而要設兩個指針和分別指示隊頭和隊尾元素在隊列中的位置,它們的初始值地隊列初始化時均應置為0。入隊時將新元素插入所指的位置,然后將加1。出隊時,刪去所指的元素,然后將加1并返回被刪元素。

杜絕“假上溢”

和棧類似,隊列中亦有上溢和下溢現象。此外,順序隊列中還存在“假上溢”現象。由于在入隊和出隊的操作中,頭尾指針僅僅添加不減小,致使被刪除元素的空間永遠無法又一次利用。因此,雖然隊列中實際的元素個數遠遠小于向量空間的規模,但也可能由于尾指針巳超出向量空間的上界而不能做入隊操作。

為充分利用向量空間。克服上述假上溢現象的方法是將向量空間想象為一個首尾相接的圓環,并稱這樣的向量為循環向量,存儲在當中的隊列稱為循環隊列(Circular?Queue)。在循環隊列中進行出隊、入隊操作時,頭尾指針仍要加1,朝前移動。僅僅只是當頭尾指針指向向量上界(QueueSize-1)時,其加1操作的結果是指向向量的下界0

實現代碼:

if(I+1 == QueueSize)
{I = 0;
}
else
{i++;
}

利用模運算可簡化為:

i = (i + 1)%QueueSize;

何時隊列為空?何時為滿?

因為入隊時尾指針向前追趕頭指針,出隊時頭指針向前追趕尾指針,故隊空和隊滿時頭尾指針均相等。因此,我們無法通過front=rear來推斷隊列“空”還是“滿”。

注:先進入的為‘頭’,后進入的為‘尾’。

解決此問題的方法至少有三種:

其一是另設一個布爾變量以匹別隊列的空和滿;

其二是少用一個元素的空間,約定入隊前,測試尾指針在循環意義下加1后是否等于頭指針,若相等則覺得隊滿(注意:rear所指的單元始終為空);

其三是使用一個計數器記錄隊列中元素的總數(實際上是隊列長度)。

隊列的基本操作:

數據元素定義

#include <stdio.h>
#include <assert.h>
#define QueueSize 100
typedef char datatype;
//隊列的數據元素
typedef struct
{int front;int rear;int count;  //計數器,用來記錄元素個數datatype data[QueueSize]; //數據內容
}cirqueue;

隊列置空

//置空隊
void InitQueue(cirqueue *q)
{q->front = q->rear = 0;q->count = 0;
}

推斷隊滿

//推斷隊滿
int QueueFull(cirqueue *q)
{return (q->count == QueueSize);
}

推斷隊空

//推斷隊空
int QueueEmpty(cirqueue *q)
{return (q->count == 0);
}

入隊

//入隊
void EnQueue(cirqueue *q, datatype x)
{assert(QueueFull(q) == 0); //q滿,終止程序q->count++;q->data[q->rear] = x;q->rear = (q->rear + 1)%QueueSize; //循環隊列設計,防止內存浪費
}

出隊

//出隊
datatype DeQueue(cirqueue *q)
{datatype temp;assert(QueueEmpty(q) == 0);//q空,則終止程序,打印錯誤信息temp = q->data[q->front];q->count--;q->front = (q->front + 1)%QueueSize;return temp;
}

取頭指針

//取頭指針
datatype QueueFront(cirqueue *q)
{assert(QueueEmpty(q) == 0);return (q->data[q->front]);
}

轉載于:https://www.cnblogs.com/gcczhongduan/p/4296460.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259366.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259366.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259366.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

T(n) = 25T(n/5)+n^2的時間復雜度 計算方法

對于T(n) a*T(n/b)c*n^k;T(1) c 這樣的遞歸關系&#xff0c;有這樣的結論&#xff1a; if (a > b^k) T(n) O(n^(logb(a)));logb(a)b為底a的對數 if (a b^k) T(n) O(n^k*logn); if (a < b^k) T(n) O(n^k); a25; b 5 ; k2 ab^k 故T(n)O(n^k*logn)O(n^2*logn)…

android jar導出,Android項目導出jar包的小技巧

我們知道&#xff0c;可以通過如下設置將一個普通的Android工程轉換成Android Library工程設置前后工程變化如下使用Ant編譯時(通過android.bat update project 命令生成 build.xml)&#xff0c;普通的Android工程會生成apk文件&#xff0c;而Android Library工程只生成jar文件…

(五十九)iOS網絡基礎之UIWebView簡易瀏覽器實現

【UIWebView網絡瀏覽器】 通過webView的loadRequest方法可以發送請求顯示相應的網站&#xff0c;例如&#xff1a; NSURL *url [NSURL URLWithString:"http://m.baidu.com"];// 創建請求數據NSURLRequest *request [NSURLRequest requestWithURL:url];// 向服務器發…

無心插柳OR志在必得?阿里推“來往”的意圖

近年來&#xff0c;阿里巴巴在外圍的動作確實不少&#xff0c;投資新浪微博、投資陌陌&#xff0c;配合阿里自身的一些戰略調整&#xff0c;讓人覺得這家公司似乎正在經歷一場前所未有的“蛻變”。其實這也不難理解&#xff0c;在BAT三國演義中&#xff0c;任何一方都不能對其他…

wampserver的mysql啟動與環境變量設置

安裝好wampserver以后&#xff0c;mysql服務默認已經啟動了。但是直接在命令行里輸入"mysql"&#xff0c;系統會提示說 mysql 不是內部或外部命令&#xff0c;也不是可運行的程序或批處理文件。 這是因為沒有增加“mysql”環境變量,請跳到第3步閱讀。 如果之前已經安…

華為mate30怎么申請鴻蒙內測,華為新系統啟動內測,mate30系列嘗鮮,網友:羨慕...

原標題&#xff1a;華為新系統啟動內測&#xff0c;mate30系列嘗鮮&#xff0c;網友&#xff1a;羨慕一款手機是否好用&#xff0c;其實取決于兩個方面&#xff0c;一個是硬件&#xff0c;另一個則是軟件&#xff0c;大家在購機的時候往往最關注的就是硬件配置&#xff0c;因為…

VMware 11完全安裝Mac OS X 10.10

----------------------------------------- 引用原文如下&#xff1a; VMware 11安裝Mac OS X 10.10_百度經驗 http://jingyan.baidu.com/article/ff411625b9011212e48237b4.html VM11安裝Mac OS X 10.10 工具/原料 1.VMware Workstation 11 2.unlocker 203&#xff08;for OS…

兩個二進制數異或的結果

【面試題目 -亢龍有悔整理】兩個二進制數異或結果是多少? a^b |a-b| (按位相減取絕對值&#xff0c;再按位累加) 兩個二進制數異或結果 是 這兩個二進制數差的絕對值&#xff0c;即表達為如下&#xff1a; a^b |a-b| &#xff08;按位相減取絕對值&#xff0c;再按位累加&am…

Xcode debug時如何查看內存中的數據

對于IPhone開發/XCode的初學者&#xff0c;如何在調試時查看變量的值是很頭痛的事情。因為Xcode的expression 經常無法正確顯示變量的值。但是強大的GDB可以很方便的幫我們查看變量的值。當執行到某斷點時&#xff0c;在GDB窗口中使用po就可以查看變量.(po print object) 1&am…

android另類工具,[置頂] android應用程序開發另解及Android SDK工具集的另類用法

轉載請注明出處&#xff1a;LouisWang http://blog.csdn.net/louiswangbing/article/details/6606865相信對于廣大Android應用開發愛好者來說&#xff0c;Android SDK工具集的大家都已經能夠很熟練的使用&#xff0c;但是我這里要介紹的是SDK工具集的非常用使用方法&#xff0c…

谷歌2007年上交大考試最后一題解答

N個整數&#xff0c;求其中任意N-1個數的乘積中的最大的一個。 例如 3,2,1,則最大的是3*26 提示&#xff1a;整數包括0和負數 要求給出個比較有效率的算法 &#xff0c;不能用除法&#xff0c;只能用乘法。 從網上找一了一個解答比較好&#xff1a;http://bbs.csdn.net/topic…

Dynamic Web Module 3.0 requires Java 1.6 or newer報錯

在項目的pom.xml的<build></build>標簽中加入&#xff1a; <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> &…

STL學習筆記5--map and multimap

Maps是一種關聯式容器&#xff0c;包含“關鍵字/值”對。 Multimaps和maps很相似&#xff0c;但是MultiMaps允許重復的元素。 簡單介紹&#xff1a; 1、聲明&#xff0c;首先包含頭文件 “map” map <int,string> test1,test2;//map <int,string>::iterator it1,it…

android讓文件按順序列表,Java/Android 獲取文件夾的文件列表(file.listFiles())并按名稱排序,中文優先...

排序規則由于是中國人&#xff0c;習慣性看中文文件夾放前面比較順眼&#xff0c;因此在別人博客(https://blog.csdn.net/da_caoyuan/article/details/56664673)的基礎上&#xff0c;加上了本身的排序規則。算法默認排序規則是按照ASCII碼表排序(http://ascii.911cha.com/),排序…

用C語言寫解釋器(一)——我們的目標

聲明為提高教學質量&#xff0c;我所在的學院正在籌劃編寫C語言教材。《用C語言寫解釋器》系列文章經整理后將收入書中“綜合實驗”一章。因此該系列的文章主要閱讀對象定為剛學完C語言的學生&#xff08;不要求有數據結構等其它知識&#xff09;&#xff0c;所以行文比較羅嗦&…

【詳解Java中格式化處理】

在Java中我們需要對一個數字進行四舍五入處理或者是對一個字符串進行格式化處理&#xff0c;我們需要使用String.Format方法或者其他格式化方法 一、Format方法 比如&#xff1a;DecimalFormat df new DecimalFormat&#xff08;"#.00"&#xff09;&#xff1b;S…

HDU4506 小明系列故事——師兄幫幫忙

問題鏈接&#xff1a;HDU4506 小明系列故事——師兄幫幫忙。 問題描述&#xff1a;參見上述鏈接。 問題分析&#xff1a;&#xff08;略&#xff09;。 程序說明&#xff1a;函數powermod()是快速模冪函數。 AC的C語言程序如下&#xff1a; /* HDU4506 小明系列故事——師兄幫幫…

1_MVC+EF+Autofac(dbfirst)輕型項目框架_core層(以登陸為例)

前言 在上一篇0_MVCEFAutofac(dbfirst)輕型項目框架_基本框架中&#xff0c;我已經介紹了這個輕型框架的層次結構&#xff0c;在下面的這篇文章中&#xff0c;我將以教師登陸功能為例&#xff0c;具體來擴充下我的core層的代碼。 在這之前&#xff0c;我想先補充討論下是否有必…

文字轉語音+html5,JS實現文字轉語音并播放

html&#xff1a;div>audio>div>js&#xff1a;function doTTS() {var ttsDiv document.getElementById(bdtts_div_id);var ttsAudio document.getElementById(tts_autio_id);var ttsText document.getElementById(ttsText).value;// 文字轉語音ttsDiv.removeChild…

字符串的全排列和組合算法

全排列在筆試面試中很熱門&#xff0c;因為它難度適中&#xff0c;既可以考察遞歸實現&#xff0c;又能進一步考察非遞歸的實現&#xff0c;便于區分出考生的水平。所以在百度和迅雷的校園招聘以及程序員和軟件設計師的考試中都考到了&#xff0c;因此本文對全排列作下總結幫助…