队列
像栈一样,队列也是数据结构中一种受限制的线性表,它是一种先进先出的数据结构,就和我们现实生活中的排队一样。
接下来我们一起来实现双向队列的一些方法
双向队列的线性存储
双向队列的类型定义
typedef struct Deque{
int *vect; //存储元素的位置
size_t size; //队列可存储元素的个数
size_t cnt; //当前元素个数
size_t front; //队列头位置
//队列尾位置可以通过头位置+元素个数即front+cnt获得
}Deque;
双向队列的初始化
void deque_init(Deque *que,size_t size){
que->vect = malloc(size*sizeof(int));
if(que->vect == NULL){
return;
}
que->size = size;
que->cnt = 0;
que->front = 0;
}
销毁一个双向队列
void deque_destroy(Deque *que){
free(que->vect);
que->vect = NULL;
}
判断队列是否为空
bool deque_is_empty(Deque *que){
return que->cnt == 0;
}
判断队列是否满
bool deque_is_full(Deque *que){
return que->cnt == que->size;
}
队首入队
void deque_push_front(Deque *que,int data){
if(deque_is_full(que)){
return;
}
que->front = que->front == 0?que->size-1:que->front+1;
que->vect[que->front] = data;
que->cnt++;
}
队尾入队
void deque_push_tail(Deque *que,int data){
if(deque_is_full(que)){
return;
}
que->vect[(que->cnt++ +que->front)%que->size] = data;
}
队首出队
int deque_pop_front(Deque *que){
if(deque_is_empty(que)){
return;
}
int data = que->vect[que->front];
que->cnt--;
que->front = (que->front+1)%que->size;
return data;
}
队尾出队
int deque_pop_tail(Deque *que){
if(deque_is_empty(que)){
return;
}
int data = que->vect[(que->front+que->cnt-1)%que->size];
que->cnt--;
retur data;
}
查看队首元素
int deque_peek_front(Deque *que){
return que->vect[que->front];
}
查看队尾元素
int deque_peek_tail(deque *que){
return que->vect[(que->front+que->cnt-1)%que->size];
}
遍历队列
void deque_foreach(Deque *que,void(*func)(int)){
size_t i;
for(i=que->front;i<que->cnt+que->front;i++){
func(que->vect[(que->cnt+que->front-1+i)%que->size]);
}
}