queue.h
#ifndef _QUEUE_H__
#define _QUEUE_H__
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef int T;
typedef struct Queue{
T *base;
size_t cap; //容量
size_t size; //元素的個數
size_t first; //佇列頭元素的下標位置
}Queue;
int queue_init(Queue *q,size_t cap);//初始化一個佇列
void queue_destroy(Queue *q);//銷燬佇列
bool queue_is_empty(Queue *q);//佇列是否爲空
bool queue_is_full(Queue *q);//佇列是否爲滿
void queue_clear(Queue *q);//清空佇列
void queue_push(Queue *q,T data);//壓一個元素進隊
T queue_pop(Queue *q);//元素出隊
T queue_peek_front(Queue *q);//檢視佇列首元素
T queue_peek_back(Queue *q);//檢視佇列尾元素
void queue_foreach(Queue *q,void (*foreach)(T));//遍歷
#endif //_QUEUE_H__
stack.c
#include "queue.h"
int queue_init(Queue *q,size_t cap){
q->base = calloc(cap,sizeof(T));
if(q->base == NULL){
return -1;
}
q->cap = cap;
q->size = 0;
q->first = 0;
return 0;
}
void queue_destroy(Queue *q){
if(q->base){
free(q->base);
}
q->base = NULL;
}
bool queue_is_empty(Queue *q){
return q->size == 0;
}
bool queue_is_full(Queue *q){
return q->size == q->cap;
}
void queue_clear(Queue *q){
q->size = 0;
q->first = 0;
}
void queue_push(Queue *q,T data){
q->base[(q->size+q->first)%q->cap] = data;//進隊要在(first+size)%cap處
++q->size;
}
T queue_pop(Queue *q){
T data = q->base[q->first];
q->first = (q->first+1)%q->cap;//出隊要把first後移,但有可能超出cap,所以要取餘;
--q->size;
return data;
}
T queue_peek_front(Queue *q){
return q->base[q->first];
}
T queue_peek_back(Queue *q){
return q->base[(q->size+q->first-1)%q->cap];
}
void queue_foreach(Queue *q,void (*foreach)(T)){
int i;
for(i=0;i<q->size;i++){
foreach(q->base[(i+q->first)%q->cap]);//遍歷要從first開始;
}
}