数据结构与算法-第四章队列

Queue.h

#ifndef _QUEUE_H__
#define _QUEUE_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int T;

typedef struct Queue{
	T *m_vect;    //存储数据的内存空间
	size_t cap;   //总容量
	size_t index; //队列头的下标位置
	size_t size;  //目前元素的个数
}Queue;

void init(Queue *que,size_t cap);//初始化
bool isEmpty(Queue *que);//是否为空
bool isFull(Queue *que);//是否已满
size_t getCap(Queue *que);//队列最大长度
size_t getSize(Queue *que);//队列中元素的个数
void push(Queue *que,T data);//队列末尾添加一个元素
T pop(Queue *que);//取出队列首的元素
T peekFront(Queue *que);//查看队列首的元素
T peekTail(Queue *que);//查找队列尾的元素
void travel(Queue *que);//遍历队列中的元素
void clear(Queue *que);//清空队列中所有的元素
void destroy(Queue *que);//销毁

#endif //_QUEUE_H__

Quque.c

#include "queue.h"
/*
typedef int T;

typedef struct Queue{
	T *m_vect;    //存储数据的内存空间
	size_t cap;   //总容量
	size_t index; //队列头的下标位置
	size_t size;  //目前元素的个数
}Queue;
*/
void init(Queue *que,size_t cap){
	que->m_vect = calloc(cap,sizeof(T));
	que->cap = cap;
	que->index = 0;
	que->size = 0;
}
bool isEmpty(Queue *que){
	return que->size == 0;	
}
bool isFull(Queue *que){
	return que->size == que->cap;	
}
size_t getCap(Queue *que){
	return que->cap;	
}
size_t getSize(Queue *que){
	return que->size;	
}
void push(Queue *que,T data){
	que->m_vect[(que->index+que->size)%que->cap] = data;
	++que->size;
}
T pop(Queue *que){
	T data = que->m_vect[que->index];
	que->index = (que->index+1)%que->cap;
	--que->size;
	return data;
}
T peekFront(Queue *que){
	return que->m_vect[que->index];	
}
T peekTail(Queue *que){
	return que->m_vect[(que->index+que->size-1)%que->cap];	
}
void travel(Queue *que){
	for(int i=0;i<que->size;i++){
		printf("%d ",que->m_vect[(i+que->index)%que->cap]);
	}	
	printf("\n");
}
void clear(Queue *que){
	while(!isEmpty(que)){
		pop(que);	
	}
	//que->index = 0;
	//que->size = 0;
}
void destroy(Queue *que){
	if(que->m_vect != NULL){
		free(que->m_vect);
		que->m_vect = NULL;
	}
}

Test.c

#include "queue.h"

int main(){
	Queue que;
	init(&que,5);
	
	int i=0;
	while(!isFull(&que)){
		push(&que,i);
		i++;
	}
	travel(&que);

	while(!isEmpty(&que)){
		printf("%d ",pop(&que));	
	}
	printf("\n");
	push(&que,10);
	push(&que,20);
	printf("%d ",pop(&que));
	push(&que,30);
	push(&que,40);
	push(&que,50);
	push(&que,60);
	travel(&que);
	printf("%d ",peekFront(&que));
	printf("%d \n",peekTail(&que));
	destroy(&que);
	return 0;	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值