生活随笔
收集整理的這篇文章主要介紹了
循环队列_数组实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
循環隊列是指, 隊尾指針走到末尾后, 還可以繼續從頭開始走.
front指針仍然是指向第一個元素的前一個元素, rear指針指向最后一個元素.
下面我們重點討論一下循環隊列如何判斷空和滿的問題?
我下面判斷隊列空和滿是直接根據q->length屬性來判斷, 當q->length為0,
表示隊列為空, 當q->length = maxSize - 1時, 隊列為滿. 由于遍歷上的原因,
隊列的最大長度只能是數組最大長度-1.
#include <stdio.h>
#include <stdlib.h>struct queue {int* data;int front;int rear;int maxSize;int length;
};
typedef struct queue node;
typedef struct queue* link;// 函數聲明
link createQueue (int maxSize);
void printQueue (link q);
int add (link q, int x);
int del (link q);int main () {int i;int maxSize = 10; // 隊列的最大長度link qhead = createQueue(maxSize);// 初始隊列信息printQueue(qhead);// 基本入隊測試for (i=1; i<=10; i++) {add(qhead, i * 2);}printQueue(qhead);// 基本出隊測試del(qhead);del(qhead);del(qhead);del(qhead);printQueue(qhead);// 循環入隊測試add(qhead, 100);add(qhead, 200);add(qhead, 300);add(qhead, 400);add(qhead, 500);printQueue(qhead);return 0;
}// 創建空隊列
link createQueue (int maxSize) {link q;q = (node*)malloc(sizeof(node));q->data = (int*)malloc(sizeof(int) * maxSize);q->front = -1;q->rear = -1;q->length = 0;q->maxSize = maxSize;return q;
}// 打印
void printQueue (link q) {int i;printf("當前隊列的信息如下: \n");printf("front = %d\n", q->front);printf("rear = %d\n", q->rear);printf("length = %d\n", q->length);printf("maxSize = %d\n", q->maxSize);// 打印隊列中的數據if (q->length == 0) {printf("當前隊列中沒有數據\n");} else {printf("隊列中的數據如下: \n");i = q->front;while (i != q->rear) {i = (i + 1) % q->maxSize;printf("%d %d\n", i, q->data[i]);}}printf("\n");
}// 入隊
int add (link q, int x) {if (q->length == q->maxSize -1 ) {printf("隊列已滿, 不能入隊\n");return 0;}q->rear = (q->rear + 1) % q->maxSize;q->data[q->rear] = x;q->length++;return 1;
}// 出隊
// 錯誤返回0, 正確返回被出隊元素的值
int del (link q) {if (q->length == 0) {printf("隊列為空, 不能出隊\n");return 0;}q->front = (q->front + 1) % q->maxSize;q->length--;return q->data[q->front];
}
轉載于:https://www.cnblogs.com/asheng2016/p/7615741.html
總結
以上是生活随笔為你收集整理的循环队列_数组实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。