一.循环队列
1.循环队列的定义
1 typedef struct 2 { 3 Decltype data[MAXSIZE]; 4 int front, rear; 5 }CSeQueue;
2.置队空
1 CSeQueue * InitCSeQueue() 2 { 3 CSeQueue *q; 4 q = (CSeQueue*)malloc(sizeof(CSeQueue)); 5 q->front = q->rear = MAXSIZE - 1; 6 return q; 7 }
3.入队
1 int InSeQueue(CSeQueue *q, Decltype x) 2 { 3 if ((q->rear + 1) % MAXSIZE == q->front) 4 { 5 printf("队满"); 6 return false; 7 } 8 else 9 { 10 q->rear = (q->rear + 1) % MAXSIZE;//入队时队尾指针 11 q->data[q->rear] = x; 12 return true; 13 } 14 }
4.出队
1 int OutSeQueue(CSeQueue *q, Decltype *x) 2 { 3 if (q->front == q->rear) 4 { 5 printf("空队"); 6 return false; 7 } 8 else 9 { 10 q->front = (q->front + 1) % MAXSIZE;//出队时队头指针 11 *x = q->data[q->front]; //读出队头元素 12 return true; 13 } 14 }
5.判队空
1 int EmptySeQueue(CSeQueue *q) 2 { 3 if (q->front == q->rear) 4 return true; 5 else 6 return false; 7 }
二.链队列
1.链队列数据类型描述
1 typedef struct node 2 { 3 Decltype data; 4 struct node *next; 5 }QNode;//列队结点的类型 6 typedef struct 7 { 8 QNode *front; 9 QNode *rear; 10 }LQueue;//将头尾指针封装在一起的链队 11 LQueue *q //定义指向列队的指针
2.创建一个带头结点的空队
1 LQueue *init_LQueue() 2 { 3 LQueue *q, *p; 4 q = malloc(sizeof(LQueue));//申请头尾指针结点 5 p = malloc(sizeof(QNode));//申请链队头结点 6 p->next = NULL; 7 q->front = q->rear = p; 8 return q; 9 }
3.入队
1 void InitQueue(LQueue *q, Decltype x) 2 { 3 QNode *p; 4 p = malloc(sizeof(QNode));//申请新结点 5 p->data = x; 6 p->next = NULL; 7 q->rear->next = p; 8 q->rear = p; 9 }
4.判队空
1 int Empty_LQueue(LQueue *q) 2 { 3 if (q->front == q->rear) 4 return 0; 5 else return true; 6 }
5.出队
1 int Out_LQueue(LQueue *q, Decltype x) 2 { 3 QNode *p; 4 if (Empty_LQueue(q)) 5 { 6 printf("队空"); 7 return false; 8 } 9 else 10 { 11 p = q->front->next; 12 q->front->next = p->next; 13 *x = p->data; 14 free(p); 15 if (q->front->next == NULL) 16 q->rear = q->front; 17 //只有一个元素时,出队后队空,修改队尾指针 18 return true; 19 } 20 }