資料結構(c語言)——順序佇列儲存結構及實現
阿新 • • 發佈:2019-01-12
使用迴圈佇列,避免出現偽滿佇列的情況
- 判斷佇列為空的條件:rear == front;
- 判斷佇列為滿的條件:(rear+1)%MAXSIZE == front;
空出一個數組元素空間,用以區別開來滿佇列和空佇列。
一個順序佇列的結構:
typedef struct{
// 定義一個數組用來儲存所有的資料元素
Element data[MAXSIZE];
// 第一個元素下標
int front;
// 最後一個元素的下標
int rear;
}SqQueue;
對順序佇列的操作:
// 初始化一個線性表 SqQueue* InitSQueue(){ SqQueue *sq = (SqQueue *)malloc(sizeof(SqQueue)); if(!sq){ exit(0); } sq->front = 0; sq->rear = 0; return sq; } // 判斷是否為空的佇列 bool SQueueEmpty(SqQueue *sq){ return sq->rear == sq->front; } // 是否為滿的佇列 bool SQueueFull(SqQueue *sq){ return (sq->rear+1)%MAXSIZE == sq->front; } Status EnSQueue(SqQueue *sq,Element v){ // 判斷佇列是否已滿 if(SQueueFull(sq)){ return ERROR; } // 進佇列,插入資料後隊尾指標後移 sq->data[sq->rear] = v; sq->rear = ++sq->rear%MAXSIZE; return OK; } Status DeSQueue(SqQueue *sq,Element *v){ // 判斷佇列是否是空佇列 if(SQueueEmpty(sq)){ return ERROR; } // 出佇列,取出資料後隊頭指標後移 *v = sq->data[sq->front]; sq->front = ++sq->front%MAXSIZE; return OK; } // 列印佇列 void PrintSQueue(SqQueue *sq){ if(!SQueueEmpty(sq)){ printf("棧內的元素依次是:["); for (int i = sq->front; i!=sq->rear; i = (i+1)%MAXSIZE) { printf("%d",sq->data[i]); if((i+1)%MAXSIZE != sq->rear){ printf(", "); } } printf("]\n"); } }
測試程式碼:
int TestSQueue(){ SqQueue *sq = InitSQueue(); SQueueCreate(sq,5); Element a; Element *resP; resP = &a; DeSQueue(sq,resP); printf("%d 元素出佇列\n",*resP); EnSQueue(sq,5); printf("元素入佇列\n"); DeSQueue(sq,resP); printf("%d 元素出佇列\n",*resP); DeSQueue(sq,resP); printf("%d 元素出佇列\n",*resP); EnSQueue(sq,6); printf("元素入佇列\n"); EnSQueue(sq,7); printf("元素入佇列\n"); DeSQueue(sq,resP); printf("%d 元素出佇列\n",*resP); PrintSQueue(sq); return 0; }
執行結果: