C 迴圈佇列實現
阿新 • • 發佈:2019-01-23
一個迴圈佇列的C語言實現,資料型別Queue
定義如下,注意在 typedef struct{...}Queue;
中Queue為資料型別,而在struct {...}Queue;
中Queue為一個變數名。
front
為隊首元素下標,始終指向隊首元素,tail
為隊尾元素的下一個位置的下標。初始狀態為front=tail=0
typedef struct {
int size,eleNum;
int* array;
int front,tail; //front指向第一個元素,rear指向最後一個元素的下一個位置
} Queue;
基本操作有:
add()
, 新增元素到隊尾
peek()
poll()
, 獲取並移出隊首元素 create(n)
, 建立大小為n的佇列 isempty()
, 判斷佇列是不是空
另外,佇列操作函式的引數都為指標,這樣可以實現模擬引用傳遞的效果,如果引數為add(Queue q,int n)
, 對佇列的修改並不會影響到初始的佇列。可以修改執行試一下。
程式碼實現如下:
#include<stdio.h>
#include<stdlib.h>
/*用c語音實現佇列基本操作
add(), 新增元素到隊尾
peek(), 獲取但並不移出頭
poll(), 獲取並移出隊首元素
create(n), 建立大小為n的佇列
isempty(), 判斷佇列是不是空
*/
typedef struct {
int size,eleNum;
int* array;
int front,tail; //front指向第一個元素,rear指向最後一個元素的下一個位置
} Queue;
//取出並移除第一個元素
int poll(Queue* q){
int res = q->array[q->front];
q->front = (++(q->front))%q->size;
q->eleNum--;
return res;
}
//獲取長度
int len(Queue* q){
return q->eleNum;
}
//插入k,返回1表示插入成功
int add(Queue* q,int k){
if(q->size==q->eleNum){
return 0;
}
q->eleNum++;
q->array[q->tail] = k;
q->tail = (q->tail+1) % q->size;
return 1;
}
//取出頭部元素,不刪除此元素,peek是“偷看”的意思
int peek(Queue* q){
return q->array[q->front];
}
//返回1表示為空,0表示不空
int isEmpty(Queue* q){
if(q->eleNum==0){
return 1;
}
return 0;
}
//建立大小為n的佇列
Queue* createQue(int n){
Queue* que = (Queue*)malloc(sizeof(Queue));
que->size = n;
que->eleNum = 0;
que->array = (int*)malloc(sizeof(int)*n);
que->front = 0;
que->tail = 0;
return que;
}
void display(Queue* q){
int i = q->front;
printf("elements: ");
while(i!=q->tail){
printf("%d ",q->array[i]);
i = (i+1)%q->size;
}
printf("\n");
printf("size: %d,elements num: %d\n",q->size,q->eleNum);
printf("front: %d, tail:%d \n",q->front,q->tail);
}
int main(){
Queue* q = createQue(10);
add(q,10); add(q,11); add(q,12);
poll(q); poll(q);
display(q);
return EXIT_SUCCESS;
}