数据结构:队列(C语言实现)含详细注释^_^

数据结构:队列(C语言实现

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开始;	
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值