#include <stdio.h> #include <stdlib.h> #define MAXSIZE 6 typedef int QElemType; typedef struct { QElemType *base; int front; int rear; }SqQueue; SqQueue *InitQueue(SqQueue* Q);//初始化 SqQueue *DestroyQueue(SqQueue* Q);//銷燬 void ClearQueue(SqQueue *Q);//清空 int QueueEmpty(SqQueue *Q);//判空 int QueueLength(SqQueue *Q);//隊列長度 QElemType GetHead(SqQueue *Q);//獲取隊頭元素 int EnQueue(SqQueue *Q, QElemType e);//插入新元素到隊尾 int DeQueue(SqQueue *Q, QElemType *e);//刪除隊頭元素 void QueueTraverse(SqQueue *Q);//遍歷 //初始化 SqQueue *InitQueue(SqQueue* Q){ Q = (SqQueue *)malloc(sizeof(SqQueue)); Q->base = (QElemType *)malloc(sizeof(QElemType)*MAXSIZE); if(!Q->base){ printf("空間不足,初始化失敗\n"); return NULL; } Q->front=Q->rear=0; printf("初始化成功\n"); return Q; } //銷燬 SqQueue *DestroyQueue(SqQueue* Q){ free(Q->base); free(Q); printf("銷燬成功\n"); return NULL; } //清空 void ClearQueue(SqQueue *Q){ int i=Q->front; while(i%MAXSIZE != Q->rear){ printf("%d被清空\n",Q->base[i%MAXSIZE]); Q->base[i%MAXSIZE] = 0; i++; } printf("清空成功\n"); } //判空,1爲空 int QueueEmpty(SqQueue *Q){ return(Q->rear == Q->front); } //返回隊列長度 int QueueLength(SqQueue *Q){ return (Q->rear-Q->front+MAXSIZE)%MAXSIZE; } //獲取隊頭元素 QElemType GetHead(SqQueue *Q){ if(Q->front != Q->rear){ printf("隊頭元素是%d\n", Q->base[Q->front]); return Q->base[Q->front]; }else{ printf("空隊列,無隊頭\n"); } } //插入新元素到隊尾,返回是否入隊成功的狀態 int EnQueue(SqQueue *Q, QElemType e){ //斷定是否還有一個空 if((Q->rear+1)%MAXSIZE == Q->front){ printf("隊列已滿,%d元素入隊失敗\n",e); return 0; } Q->base[Q->rear] = e; //插入後尾指針加一 Q->rear = (Q->rear+1)%MAXSIZE; printf("%d入隊成功\n", e); return 1; } //刪除隊頭元素 int DeQueue(SqQueue *Q, QElemType *e){ //判空 if(Q->front==Q->rear){ printf("空隊列,刪除失敗\n"); return 0; } *e = Q->base[Q->front]; Q->front=(Q->front+1)%MAXSIZE; printf("%d元素出隊成功\n", *e); return 1; } //遍歷 void QueueTraverse(SqQueue *Q){ if(QueueEmpty(Q)){ printf("空隊列\n"); return; } int i=Q->front; //只要不等於尾指針就一直遍歷 while(i%MAXSIZE != Q->rear){ printf("%d ",Q->base[i%MAXSIZE]); i++; } printf("\n"); } int main(void) { SqQueue *Q = NULL; QElemType e = NULL; //初始化測試 Q = InitQueue(Q); //遍歷測試 QueueTraverse(Q); // //入隊測試 // EnQueue(Q, 1); // EnQueue(Q, 2); // EnQueue(Q, 3); // EnQueue(Q, 4); // QueueTraverse(Q); // //長度測試 // printf("隊列長度爲%d\n",QueueLength(Q)); // EnQueue(Q, 1); // EnQueue(Q, 2); // EnQueue(Q, 3); // EnQueue(Q, 4); // printf("隊列長度爲%d\n",QueueLength(Q)); // EnQueue(Q, 5); // EnQueue(Q, 6); // printf("隊列長度爲%d\n",QueueLength(Q)); // //出隊測試 // DeQueue(Q, &e); // printf("測試e是否改變:%d\n",e); // QueueTraverse(Q); // //獲取隊頭元素測試 // e = GetHead(Q); // EnQueue(Q, 999); // e = GetHead(Q); // //出入測試 // EnQueue(Q, 1); // EnQueue(Q, 3); // EnQueue(Q, 5); // EnQueue(Q, 7); // EnQueue(Q, 9); // EnQueue(Q, 11); // QueueTraverse(Q); // DeQueue(Q, &e); // DeQueue(Q, &e); // DeQueue(Q, &e); // QueueTraverse(Q); // EnQueue(Q, 7); // EnQueue(Q, 9); // EnQueue(Q, 11); // EnQueue(Q, 13); // QueueTraverse(Q); // //清空測試 // EnQueue(Q, 7); // EnQueue(Q, 9); // EnQueue(Q, 11); // EnQueue(Q, 13); // ClearQueue(Q); // QueueTraverse(Q); //銷燬測試 EnQueue(Q, 7); EnQueue(Q, 9); EnQueue(Q, 11); EnQueue(Q, 13); Q = DestroyQueue(Q); QueueTraverse(Q); return 0; }