线性表-----队列
1、基本概念
- 隊列是只允許在一端進行插入,而在另一段進行刪除的線性表
- 隊頭:允許刪除的一端
- 隊尾:允許插入的一端
- 空隊列:沒有任何元素的空表
隊列是操作受限的線性表,因此不是任何對線性表的操作都可以作為隊列的操作,比如,不可以隨便讀取隊列中間某個數(shù)據(jù)
2、順序隊列
隊列的順序實現(xiàn)是指分配一塊連續(xù)存儲單元存放隊列中的元素,并設兩個指針front和rear分別指向隊頭和隊尾元素的元素。隊尾rear指針指向隊尾元素的下一個位置(也可以讓rear指向隊尾元素,front指向隊頭元素的前一個位置),為什么要這樣處理呢?當隊列中只有一個元素是,rear和front將會相等,處理起來很麻煩。
- 初始狀態(tài)(隊空條件):front==rear==0
- 進隊:不滿時,送值到隊尾,隊尾rear加1
- 出隊:不空時,取隊頭元素,隊頭front加1
當此時隊列的狀態(tài)為上圖的d時,在入隊,現(xiàn)任此時rear再加一會出現(xiàn)溢出,但這種溢出并不是真正的溢出,在data數(shù)組里依然有位置存放數(shù)據(jù),所以這是一種假溢出
2、循環(huán)隊列
把存儲隊列元素的表從邏輯上看作是一個環(huán),稱為循環(huán)隊列。當用循環(huán)隊列時,上面順序隊列出現(xiàn)假溢出的問題就能解決
- 初始時,Q.front=Q.rear=0
- (出隊) front指針加1:Q.front=(Q.front+1)%MaxSize
- (入隊)rear指針加1:Q.rear=(Q.rear+1)%MaxSize
- 隊列長度:(Q.rear-Q.front+MaxSize)%MaxSize
- 出隊入隊指針按順時針方向進1
如何判斷隊列空和隊滿呢?
法1:犧牲一個單元來區(qū)分隊空和隊滿,入隊時少用一個隊列單元,這是個普遍的做法,約定以:隊頭指針在隊尾指針的下一個位置作為隊滿的標志
- 隊滿:(Q.rear+1)%MaxSize==Q.front
- 隊空條件:Q.front==Q.rear(注意和順序隊列區(qū)分開,Q.front==Q.rear==0)
- 隊中元素個數(shù):(Q.rear-Q.front+MaxSize)%MaxSize
法2:類型中增設表示元素個數(shù)的數(shù)據(jù)成員。這樣,
- 隊空的條件為Q.size==0
- 隊滿:Q.size==MaxSize
法3:類型增設tag數(shù)據(jù)成員,以區(qū)分隊滿還是隊空。tag等于0時,若因刪除導致QQ.front==Q.rear,則為對空;tag等于1時,若因插入導致Q.front==Q.rear,則為隊滿
3、鏈式隊列
隊列的鏈式存儲結構,其實就是線性表的單鏈表,只不過需要加點限制,只能在表尾插入,表頭刪除。
- 當 Q.front ==NULL && Q.rear==NULL時,鏈式隊列為空
4、雙端隊列
雙端隊列是指允許兩端都可以進行入隊和出隊操作的隊列,將隊列的兩端分別稱為前端和后端,不再是隊頭和隊尾,其邏輯結構依然是線性結構。
輸出受限的雙端隊列:允許在一端進行插入和刪除,但在另一端只允許插入的雙端隊列被稱為輸出受限的雙端隊列
輸入受限的雙端隊列:允許在一端進行插入和刪除,但另一端只允許刪除的雙端隊列稱為輸入受限的雙端隊列
總結
以上是生活随笔為你收集整理的线性表-----队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性表------栈
- 下一篇: C和汇编---while反汇编