佇列的順序儲存結構
佇列的順序儲存結構相對於鏈式儲存結構較為複雜,本文重點介紹佇列順序結構。下面簡單的談兩個問題:
1.由於是順序佇列,很容易想到用陣列來儲存元素,假如一個佇列的長度是10,就是一下可以放入10個元素,當9個元素出隊後,又放入3個元素,此時是不是要再增長陣列的長度呢?實際中不可能增加陣列的長度而任記憶體空間的浪費,所以我們要構造迴圈佇列,也就是當rear=(佇列的長度-1),下一個入隊元素的位置是rear=(rear+1)%(佇列的長度),同理front也是如此。只要是順序佇列都是迴圈佇列。
2.如何判斷什麼時候佇列是空,什麼時候佇列已經滿了呢?這個是實際中不可避免的問題。在順序佇列中,我們通常用front,rear兩個"指標"來進行入隊和出隊的操作,在佇列的初始化時,front=rear,此時佇列為空,這是佇列為空的判斷條件;那麼什麼時候佇列滿了呢,通常留一個儲存空間不儲存元素,此時判斷佇列滿的條件就是(rear+1)%(佇列的長度) = front,解決了當rear = front時,不知道是隊滿還是隊空的問題。
簡單的介紹了迴圈佇列中的棘手的問題,下面給出簡單實現的程式碼:
執行結果:
以上只是粗略的介紹,當然更為詳細的是畫圖分析該過程,由於畫圖比較繁瑣,這裡不作展示。
1.由於是順序佇列,很容易想到用陣列來儲存元素,假如一個佇列的長度是10,就是一下可以放入10個元素,當9個元素出隊後,又放入3個元素,此時是不是要再增長陣列的長度呢?實際中不可能增加陣列的長度而任記憶體空間的浪費,所以我們要構造迴圈佇列,也就是當rear=(佇列的長度-1),下一個入隊元素的位置是rear=(rear+1)%(佇列的長度),同理front也是如此。只要是順序佇列都是迴圈佇列。
2.如何判斷什麼時候佇列是空,什麼時候佇列已經滿了呢?這個是實際中不可避免的問題。在順序佇列中,我們通常用front,rear兩個"指標"來進行入隊和出隊的操作,在佇列的初始化時,front=rear,此時佇列為空,這是佇列為空的判斷條件;那麼什麼時候佇列滿了呢,通常留一個儲存空間不儲存元素,此時判斷佇列滿的條件就是(rear+1)%(佇列的長度) = front,解決了當rear = front時,不知道是隊滿還是隊空的問題。
簡單的介紹了迴圈佇列中的棘手的問題,下面給出簡單實現的程式碼:
點選(此處)摺疊或開啟
-
#include<iostream>
-
#define MAX_SIZE 10
-
using namespace std;
-
-
struct Squeue {
-
int data[MAX_SIZE];
-
int rear, front;
-
};
-
-
void initSqueue(Squeue *);
-
void emptySqueue(Squeue *);
-
void fullSqueue(Squeue *);
-
void Insqueue(Squeue *, int);
-
void Outsqueue(Squeue *, int *);
-
void ergodicSqueue(Squeue *);
-
-
void initSqueue(Squeue *q) {
-
q->front = 0;
-
q->rear = 0;
-
}
-
void emptySqueue(Squeue *q) {
-
if (q->rear == q->front) { //判斷佇列空的條件
-
cout << "佇列為空!!!" << endl;
-
exit(-1);
-
}
-
else
-
return;
-
}
-
void fullSqueue(Squeue *q) {
-
if ((q->rear + 1) % MAX_SIZE == q->front){ //判斷佇列已滿的條件
-
cout << "佇列已滿!!!" << endl;
-
exit(-1);
-
}
-
else
-
return;
-
}
-
void Insqueue(Squeue *q, int e) {
-
fullSqueue(q); //入隊時判斷佇列是否已滿
-
q->data[q->rear] = e;
-
q->rear = (q->rear + 1) % MAX_SIZE;
-
}
-
void Outsqueue(Squeue *q, int *e) {
-
emptySqueue(q); //出隊時判斷佇列是否已空
-
*e = q->data[q->front];
-
q->front = (q->front + 1) % MAX_SIZE;
-
}
-
void ergodicSqueue(Squeue *q) { //對佇列進行入隊出隊操作後,列印在佇列中的元素
-
int i = 0;
-
cout << "在佇列中的元素是:";
-
while (q->front != q->rear) {
-
cout << q->data[q->front] << ",";
-
q->front = (q->front + 1) % MAX_SIZE;
-
i++;
-
}
-
cout << endl;
-
cout << "佇列中的元素個數為:" << i << endl; //統計佇列中元素的個數
-
}
-
int main() {
-
-
Squeue queue;
-
int e = 0;
-
initSqueue(&queue);
-
for (int i = 1; i <= 9; i++) {
-
Insqueue(&queue, i);
-
}
-
Outsqueue(&queue, &e);
-
cout << "出隊的元素是:" << e << endl;
-
Outsqueue(&queue, &e);
-
cout << "出隊的元素是:" << e << endl;
-
-
Insqueue(&queue, 10);
-
Outsqueue(&queue, &e);
-
cout << "出隊的元素是:" << e << endl;
-
ergodicSqueue(&queue);
- }
以上只是粗略的介紹,當然更為詳細的是畫圖分析該過程,由於畫圖比較繁瑣,這裡不作展示。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1847566/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 佇列-順序儲存佇列
- 佇列的順序儲存--迴圈佇列的建立佇列
- 串的順序儲存結構
- 列定義的順序和列儲存的順序
- 利用順序儲存結構實現雙端佇列的入隊和出隊操作佇列
- 佇列的鏈式儲存結構佇列
- 【資料結構】佇列(順序佇列、鏈佇列)的JAVA程式碼實現資料結構佇列Java
- 11 線性表的順序儲存結構
- 線性表之順序儲存結構
- 【資料結構】順序佇列的實現(c++)資料結構佇列C++
- 佇列的鏈式儲存結構的實現佇列
- 順序佇列基本操作佇列
- 8-佇列的鏈式儲存結構的操作佇列
- C#資料結構-二叉樹-順序儲存結構C#資料結構二叉樹
- 線性結構(順序儲存和鏈式儲存)和非線性結構的特點及區別
- 優先順序佇列是一種什麼樣的資料結構佇列資料結構
- 棧1: 順序儲存
- 佇列順序性引發的思考佇列
- 第2章 順序表及其順序儲存
- 封裝優先順序佇列封裝佇列
- 【資料結構】二叉樹(順序儲存、鏈式儲存)的JAVA程式碼實現資料結構二叉樹Java
- 棧,佇列,優先順序佇列簡單介面使用佇列
- Redis實現任務佇列、優先順序佇列Redis佇列
- 順序結構
- 【資料結構】堆排序和模擬實現優先順序佇列!!資料結構排序佇列
- 順序迴圈佇列的介面設計佇列
- 鏈式儲存的佇列佇列
- 佇列 優先順序佇列 python 程式碼實現佇列Python
- 使用C#實現順序佇列C#佇列
- 順序結構儲存串實現串萬用字元匹配的演算法字元演算法
- 順序表(順序儲存)迴圈佇列類(初始化,入隊,退隊,輸出排頭與排尾指標及元素)佇列指標
- 佇列-鏈式儲存佇列
- 如何保證訊息佇列的順序性?佇列
- Facebook的分散式優先順序佇列FOQS分散式佇列
- mysql儲存過程宣告順序MySql儲存過程
- Java優先順序佇列DelayedWorkQueue原理分析Java佇列
- Laravel 的佇列的任務連結是否保證了消費順序?Laravel佇列
- 刷題系列 - 合併兩個順序佇列為一個新的佇列佇列