c语言实现数据结构----队列

队列

一样,队列也是数据结构中一种受限制的线性表,它是一种先进先出的数据结构,就和我们现实生活中的排队一样。
在这里插入图片描述
接下来我们一起来实现双向队列的一些方法

双向队列的线性存储

双向队列的类型定义

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]);
	}
}
发布了14 篇原创文章 · 获赞 84 · 访问量 2791

猜你喜欢

转载自blog.csdn.net/weixin_42617375/article/details/103741664
今日推荐