佇列順序儲存4
阿新 • • 發佈:2021-08-02
一、定義一個結構體
#include <stdio.h> #include <string.h> #define MAXSIZE 10 // 迴圈佇列的最大長度,最多可以存放MAXSIZE個元素。 typedef int ElemType; // 自定義迴圈佇列的資料元素為整數。 typedef struct { ElemType data[MAXSIZE]; // 用陣列儲存迴圈佇列中的元素。 int front; // 佇列的頭指標。 int rear; // 佇列的尾指標,指向隊尾元素。 int length; // 佇列的實際長度。 // xxx }SeqQueue,*PSeqQueue; int main() { return 0; }
二、建立迴圈佇列並初始化
// 迴圈佇列QQ的初始化操作。 void InitQueue(PSeqQueue QQ); // 清空迴圈佇列。 void Clear(PSeqQueue QQ); int main() { SeqQueue QQ; // 建立迴圈佇列。 InitQueue(&QQ); // 初始化迴圈佇列。 return 0; } // 初始化迴圈佇列 void InitQueue(PSeqQueue QQ) { Clear(QQ); // 清空迴圈佇列。 } // 清空迴圈佇列。 void Clear(PSeqQueue QQ) { if (QQ == NULL) return; // 檢查空指標。 QQ->front=0; QQ->rear=MAXSIZE-1; // xxxx QQ->length=0; memset(QQ->data,0,sizeof(ElemType)*MAXSIZE); // 陣列元素清零。 }
三、建立一個數據元素。
int main()
{
SeqQueue QQ; // 建立迴圈佇列。
InitQueue(&QQ); // 初始化迴圈佇列。
ElemType ee; // 建立一個數據元素。
return 0;
}
ElemType ee; // 建立一個數據元素。
四、佇列長度
// 求迴圈佇列的長度,返回值:>=0-佇列QQ元素的個數。 int Length(PSeqQueue QQ); int main() { SeqQueue QQ; // 建立迴圈佇列。 InitQueue(&QQ); // 初始化迴圈佇列。 ElemType ee; // 建立一個數據元素。 printf("佇列的長度是%d\n",Length(&QQ)); return 0; } // 求迴圈佇列的長度,返回值:>=0-佇列QQ元素的個數。 int Length(PSeqQueue QQ) { if (QQ == NULL) return 0; // 檢查空指標。 return QQ->length; // xxx }
五、入隊
// 判斷迴圈佇列是否已滿,返回值:1-已滿,0-未滿或失敗。
int IsFull(PSeqQueue QQ);
// 元素入隊,返回值:0-失敗;1-成功。
int InQueue(PSeqQueue QQ, ElemType *ee);
int main()
{
SeqQueue QQ; // 建立迴圈佇列。
InitQueue(&QQ); // 初始化迴圈佇列。
ElemType ee; // 建立一個數據元素。
printf("元素(1、2、3、4、5、6、7、8、9、10、11)入隊。\n");
ee=1; InQueue(&QQ, &ee);
ee=2; InQueue(&QQ, &ee);
ee=3; InQueue(&QQ, &ee);
ee=4; InQueue(&QQ, &ee);
ee=5; InQueue(&QQ, &ee);
ee=6; InQueue(&QQ, &ee);
ee=7; InQueue(&QQ, &ee);
ee=8; InQueue(&QQ, &ee);
ee=9; InQueue(&QQ, &ee);
ee=10; InQueue(&QQ, &ee);
ee=11; InQueue(&QQ, &ee);
printf("佇列的長度是%d\n",Length(&QQ));
return 0;
}
// 判斷迴圈佇列是否已滿,返回值:1-已滿,0-未滿或失敗。
int IsFull(PSeqQueue QQ)
{
if (QQ == NULL) return 0; // 檢查空指標。
// if ( ((QQ->rear+1)%MAXSIZE) == QQ->front) return 1;
if (QQ->length == MAXSIZE) return 1; // xxx
return 0;
}
// 元素入隊,返回值:0-失敗;1-成功。
int InQueue(PSeqQueue QQ, ElemType *ee)
{
if ( (QQ == NULL) || (ee == NULL) ) return 0; // 檢查空指標。
if (IsFull(QQ) == 1)
{
printf("迴圈佇列已滿,不能插入。\n"); return 0;
}
// xxxx 先移動隊尾指標,然後再插入資料。
QQ->rear=(QQ->rear+1)%MAXSIZE; // 隊尾指標後移。
memcpy(&QQ->data[QQ->rear],ee,sizeof(ElemType)); // 用陣列的下標訪問。
// memcpy(QQ->data+QQ->rear,ee,sizeof(ElemType)); // 採用指標運算也可以。
QQ->length++; // xxx
return 1;
}
六、檢視佇列元素
// 判斷迴圈佇列是否為空,返回值:1-空,0-非空或失敗。
int IsEmpty(PSeqQueue QQ);
// 列印迴圈佇列中全部的元素。
void PrintQueue(PSeqQueue QQ);
int main()
{
SeqQueue QQ; // 建立迴圈佇列。
InitQueue(&QQ); // 初始化迴圈佇列。
ElemType ee; // 建立一個數據元素。
printf("元素(1、2、3、4、5、6、7、8、9、10、11)入隊。\n");
ee=1; InQueue(&QQ, &ee);
ee=2; InQueue(&QQ, &ee);
ee=3; InQueue(&QQ, &ee);
ee=4; InQueue(&QQ, &ee);
ee=5; InQueue(&QQ, &ee);
ee=6; InQueue(&QQ, &ee);
ee=7; InQueue(&QQ, &ee);
ee=8; InQueue(&QQ, &ee);
ee=9; InQueue(&QQ, &ee);
ee=10; InQueue(&QQ, &ee);
ee=11; InQueue(&QQ, &ee);
printf("佇列的長度是%d\n",Length(&QQ));
PrintQueue(&QQ);
return 0;
}
// 判斷迴圈佇列是否為空,返回值:1-空,0-非空或失敗。
int IsEmpty(PSeqQueue QQ)
{
if (QQ == NULL) return 0; // 檢查空指標。
// if (QQ->front == QQ->rear) return 1;
if (QQ->length == 0) return 1; // xxx
return 0;
}
// 列印迴圈佇列中全部的元素。
void PrintQueue(PSeqQueue QQ)
{
if (QQ == NULL) return; // 檢查空指標。
if (IsEmpty(QQ) == 1) { printf("佇列為空。\n"); return; }
int kk,qlen=Length(QQ);
for (kk = 0; kk < qlen; kk++)
{
// 用陣列的下標訪問。
printf("data[%d],value=%d\n",(QQ->front+kk)%MAXSIZE,QQ->data[(QQ->front+kk)%MAXSIZE]);
// 採用指標運算也可以。
// printf("data[%d],value=%d\n",(QQ->front+kk)%MAXSIZE,*(QQ->data+(QQ->front+kk)%MAXSIZE));
}
}
七、出隊
// 元素出隊,返回值:0-失敗;1-成功。
int OutQueue(PSeqQueue QQ, ElemType *ee);
int main()
{
SeqQueue QQ; // 建立迴圈佇列。
InitQueue(&QQ); // 初始化迴圈佇列。
ElemType ee; // 建立一個數據元素。
printf("元素(1、2、3、4、5、6、7、8、9、10、11)入隊。\n");
ee=1; InQueue(&QQ, &ee);
ee=2; InQueue(&QQ, &ee);
ee=3; InQueue(&QQ, &ee);
ee=4; InQueue(&QQ, &ee);
ee=5; InQueue(&QQ, &ee);
ee=6; InQueue(&QQ, &ee);
ee=7; InQueue(&QQ, &ee);
ee=8; InQueue(&QQ, &ee);
ee=9; InQueue(&QQ, &ee);
ee=10; InQueue(&QQ, &ee);
ee=11; InQueue(&QQ, &ee);
printf("佇列的長度是%d\n",Length(&QQ));
PrintQueue(&QQ);
if (OutQueue(&QQ,&ee)==1) printf("出隊的元素值為%d\n",ee);
if (OutQueue(&QQ,&ee)==1) printf("出隊的元素值為%d\n",ee);
if (OutQueue(&QQ,&ee)==1) printf("出隊的元素值為%d\n",ee);
if (OutQueue(&QQ,&ee)==1) printf("出隊的元素值為%d\n",ee);
if (OutQueue(&QQ,&ee)==1) printf("出隊的元素值為%d\n",ee);
if (OutQueue(&QQ,&ee)==1) printf("出隊的元素值為%d\n",ee);
if (OutQueue(&QQ,&ee)==1) printf("出隊的元素值為%d\n",ee);
printf("佇列的長度是%d\n",Length(&QQ));
PrintQueue(&QQ);
return 0;
}
// 元素出隊,返回值:0-失敗;1-成功。
int OutQueue(PSeqQueue QQ, ElemType *ee)
{
if ( (QQ == NULL) || (ee == NULL) ) return 0; // 檢查空指標。
if (IsEmpty(QQ) == 1) { printf("佇列為空。\n"); return 0; }
memcpy(ee,&QQ->data[QQ->front],sizeof(ElemType)); // 用陣列的下標訪問。
// memcpy(ee,QQ->data+QQ->front,sizeof(ElemType)); // 採用指標運算也可以。
QQ->front=(QQ->front+1)%MAXSIZE; // 佇列頭指標後移。
QQ->length--; // xxx
return 1;
}
八、檢視隊頭元素
// 獲取隊頭元素,返回值:0-失敗;1-成功。
// 只檢視隊頭元素的值,元素不出隊。
int GetHead(PSeqQueue QQ, ElemType *ee);
int main()
{
SeqQueue QQ; // 建立迴圈佇列。
InitQueue(&QQ); // 初始化迴圈佇列。
ElemType ee; // 建立一個數據元素。
printf("元素(1、2、3、4、5、6、7、8、9、10、11)入隊。\n");
ee=1; InQueue(&QQ, &ee);
ee=2; InQueue(&QQ, &ee);
ee=3; InQueue(&QQ, &ee);
ee=4; InQueue(&QQ, &ee);
ee=5; InQueue(&QQ, &ee);
ee=6; InQueue(&QQ, &ee);
ee=7; InQueue(&QQ, &ee);
ee=8; InQueue(&QQ, &ee);
ee=9; InQueue(&QQ, &ee);
ee=10; InQueue(&QQ, &ee);
ee=11; InQueue(&QQ, &ee);
// 只檢視隊頭元素的值,元素不出隊。
if (GetHead(&QQ,&ee)==1) printf("隊頭的元素值為%d\n",ee);
return 0;
}
// 獲取隊頭元素,返回值:0-失敗;1-成功。
// 只檢視隊頭元素的值,元素不出隊。
int GetHead(PSeqQueue QQ, ElemType *ee)
{
if ( (QQ == NULL) || (ee == NULL) ) return 0; // 檢查空指標。
if (IsEmpty(QQ) == 1) { printf("佇列為空。\n"); return 0; }
memcpy(ee,&QQ->data[QQ->front],sizeof(ElemType)); // 用陣列的下標訪問。
// memcpy(ee,QQ->data+QQ->front,sizeof(ElemType)); // 採用指標運算也可以。
return 1;
}
九、完整程式碼
/*
* 程式名:seqqueue4.c,此程式演示迴圈佇列的陣列實現,隊尾指標指向隊尾元素,增加了length的輔助變數。
* 作者:C語言技術網(www.freecplus.net) 日期:20201230
*/
#include <stdio.h>
#include <string.h>
#define MAXSIZE 10 // 迴圈佇列的最大長度,最多可以存放MAXSIZE個元素。
typedef int ElemType; // 自定義迴圈佇列的資料元素為整數。
typedef struct
{
ElemType data[MAXSIZE]; // 用陣列儲存迴圈佇列中的元素。
int front; // 佇列的頭指標。
int rear; // 佇列的尾指標,指向隊尾元素。
int length; // 佇列的實際長度。 // xxx
}SeqQueue,*PSeqQueue;
// 迴圈佇列QQ的初始化操作。
void InitQueue(PSeqQueue QQ);
// 銷燬迴圈佇列QQ。
void DestroyQueue(PSeqQueue QQ);
// 元素入隊,返回值:0-失敗;1-成功。
int InQueue(PSeqQueue QQ, ElemType *ee);
// 元素出隊,返回值:0-失敗;1-成功。
int OutQueue(PSeqQueue QQ, ElemType *ee);
// 求迴圈佇列的長度,返回值:>=0-佇列QQ元素的個數。
int Length(PSeqQueue QQ);
// 清空迴圈佇列。
void Clear(PSeqQueue QQ);
// 判斷迴圈佇列是否為空,返回值:1-空,0-非空或失敗。
int IsEmpty(PSeqQueue QQ);
// 判斷迴圈佇列是否已滿,返回值:1-已滿,0-未滿或失敗。
int IsFull(PSeqQueue QQ);
// 列印迴圈佇列中全部的元素。
void PrintQueue(PSeqQueue QQ);
// 獲取隊頭元素,返回值:0-失敗;1-成功。
// 只檢視隊頭元素的值,元素不出隊。
int GetHead(PSeqQueue QQ, ElemType *ee);
int main()
{
SeqQueue QQ; // 建立迴圈佇列。
InitQueue(&QQ); // 初始化迴圈佇列。
ElemType ee; // 建立一個數據元素。
printf("元素(1、2、3、4、5、6、7、8、9、10、11)入隊。\n");
ee=1; InQueue(&QQ, &ee);
ee=2; InQueue(&QQ, &ee);
ee=3; InQueue(&QQ, &ee);
ee=4; InQueue(&QQ, &ee);
ee=5; InQueue(&QQ, &ee);
ee=6; InQueue(&QQ, &ee);
ee=7; InQueue(&QQ, &ee);
ee=8; InQueue(&QQ, &ee);
ee=9; InQueue(&QQ, &ee);
ee=10; InQueue(&QQ, &ee);
ee=11; InQueue(&QQ, &ee);
printf("佇列的長度是%d\n",Length(&QQ));
PrintQueue(&QQ);
if (OutQueue(&QQ,&ee)==1) printf("出隊的元素值為%d\n",ee);
if (OutQueue(&QQ,&ee)==1) printf("出隊的元素值為%d\n",ee);
if (OutQueue(&QQ,&ee)==1) printf("出隊的元素值為%d\n",ee);
if (OutQueue(&QQ,&ee)==1) printf("出隊的元素值為%d\n",ee);
if (OutQueue(&QQ,&ee)==1) printf("出隊的元素值為%d\n",ee);
if (OutQueue(&QQ,&ee)==1) printf("出隊的元素值為%d\n",ee);
if (OutQueue(&QQ,&ee)==1) printf("出隊的元素值為%d\n",ee);
printf("佇列的長度是%d\n",Length(&QQ));
PrintQueue(&QQ);
printf("元素(11、12、13、14、15)入隊。\n");
ee=11; InQueue(&QQ, &ee);
ee=12; InQueue(&QQ, &ee);
ee=13; InQueue(&QQ, &ee);
ee=14; InQueue(&QQ, &ee);
ee=15; InQueue(&QQ, &ee);
printf("佇列的長度是%d\n",Length(&QQ));
PrintQueue(&QQ);
// 只檢視隊頭元素的值,元素不出隊。
if (GetHead(&QQ,&ee)==1) printf("隊頭的元素值為%d\n",ee);
return 0;
}
// 初始化迴圈佇列
void InitQueue(PSeqQueue QQ)
{
Clear(QQ); // 清空迴圈佇列。
}
// 清空迴圈佇列。
void Clear(PSeqQueue QQ)
{
if (QQ == NULL) return; // 檢查空指標。
QQ->front=0;
QQ->rear=MAXSIZE-1; // xxxx
QQ->length=0;
memset(QQ->data,0,sizeof(ElemType)*MAXSIZE); // 陣列元素清零。
}
// 求迴圈佇列的長度,返回值:>=0-佇列QQ元素的個數。
int Length(PSeqQueue QQ)
{
if (QQ == NULL) return 0; // 檢查空指標。
return QQ->length; // xxx
}
// 銷燬迴圈佇列QQ。
void DestroyQueue(PSeqQueue QQ)
{
// 靜態迴圈佇列無需釋放記憶體,不需要銷燬操作。
Clear(QQ); // 清空迴圈佇列。
return;
}
// 判斷迴圈佇列是否為空,返回值:1-空,0-非空或失敗。
int IsEmpty(PSeqQueue QQ)
{
if (QQ == NULL) return 0; // 檢查空指標。
// if (QQ->front == QQ->rear) return 1;
if (QQ->length == 0) return 1; // xxx
return 0;
}
// 判斷迴圈佇列是否已滿,返回值:1-已滿,0-未滿或失敗。
int IsFull(PSeqQueue QQ)
{
if (QQ == NULL) return 0; // 檢查空指標。
// if ( ((QQ->rear+1)%MAXSIZE) == QQ->front) return 1;
if (QQ->length == MAXSIZE) return 1; // xxx
return 0;
}
// 元素入隊,返回值:0-失敗;1-成功。
int InQueue(PSeqQueue QQ, ElemType *ee)
{
if ( (QQ == NULL) || (ee == NULL) ) return 0; // 檢查空指標。
if (IsFull(QQ) == 1)
{
printf("迴圈佇列已滿,不能插入。\n"); return 0;
}
// xxxx 先移動隊尾指標,然後再插入資料。
QQ->rear=(QQ->rear+1)%MAXSIZE; // 隊尾指標後移。
memcpy(&QQ->data[QQ->rear],ee,sizeof(ElemType)); // 用陣列的下標訪問。
// memcpy(QQ->data+QQ->rear,ee,sizeof(ElemType)); // 採用指標運算也可以。
QQ->length++; // xxx
return 1;
}
// 列印迴圈佇列中全部的元素。
void PrintQueue(PSeqQueue QQ)
{
if (QQ == NULL) return; // 檢查空指標。
if (IsEmpty(QQ) == 1) { printf("佇列為空。\n"); return; }
int kk,qlen=Length(QQ);
for (kk = 0; kk < qlen; kk++)
{
// 用陣列的下標訪問。
printf("data[%d],value=%d\n",(QQ->front+kk)%MAXSIZE,QQ->data[(QQ->front+kk)%MAXSIZE]);
// 採用指標運算也可以。
// printf("data[%d],value=%d\n",(QQ->front+kk)%MAXSIZE,*(QQ->data+(QQ->front+kk)%MAXSIZE));
}
}
// 元素出隊,返回值:0-失敗;1-成功。
int OutQueue(PSeqQueue QQ, ElemType *ee)
{
if ( (QQ == NULL) || (ee == NULL) ) return 0; // 檢查空指標。
if (IsEmpty(QQ) == 1) { printf("佇列為空。\n"); return 0; }
memcpy(ee,&QQ->data[QQ->front],sizeof(ElemType)); // 用陣列的下標訪問。
// memcpy(ee,QQ->data+QQ->front,sizeof(ElemType)); // 採用指標運算也可以。
QQ->front=(QQ->front+1)%MAXSIZE; // 佇列頭指標後移。
QQ->length--; // xxx
return 1;
}
// 獲取隊頭元素,返回值:0-失敗;1-成功。
// 只檢視隊頭元素的值,元素不出隊。
int GetHead(PSeqQueue QQ, ElemType *ee)
{
if ( (QQ == NULL) || (ee == NULL) ) return 0; // 檢查空指標。
if (IsEmpty(QQ) == 1) { printf("佇列為空。\n"); return 0; }
memcpy(ee,&QQ->data[QQ->front],sizeof(ElemType)); // 用陣列的下標訪問。
// memcpy(ee,QQ->data+QQ->front,sizeof(ElemType)); // 採用指標運算也可以。
return 1;
}