用C语言实现FIFO

这是一个先进先出的环形队列,结构体包括队列和头尾指针。宏定义队列的最大长度。main函数里有实现的demo。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX 5 

typedef struct{
	int queue[MAX] ;
	unsigned int head ;
	unsigned int tail ; 
}FIFO;

//-------初始化 
FIFO * init(){
	FIFO * qQueue ;
	qQueue = (FIFO *)malloc(sizeof(FIFO)) ;
	memset(qQueue , 0x00 , sizeof(FIFO)) ;
	return qQueue ;
}
//-------满 
int isFull(FIFO * qQueue){
	int ret = 1 ;
	unsigned int hd = qQueue->head ;
	unsigned int tl = qQueue->tail ;
	if((tl + 1) == MAX){
		tl = 0 ;
		if(tl == hd){
			goto OUT ;
		}else{
			ret = 0 ;
		}
	}else if((tl + 1) == hd){
		goto OUT ;
	}else{
		ret = 0 ;
	}
	
OUT :	
	return ret ;
}
//-------空 
int isEmpty(FIFO * qQueue){
	int ret = 1 ;
	unsigned int hd = qQueue->head ;
	unsigned int tl = qQueue->tail ;
	if(hd == tl){
		goto OUT ;
	}else{
		ret = 0 ;
	}
	
OUT :	
	return ret ;
}
//-------添加数据 
int insertData(FIFO * qQueue , int data){
	int ret = 0 ;
	if(isFull(qQueue)){
		ret = -1 ;
		goto OUT ;	
	}
	
	if(qQueue->tail == MAX - 1){
		qQueue->queue[qQueue->tail] = data ;
		qQueue->tail = 0 ;
	}else{
		qQueue->queue[qQueue->tail] = data ;
		qQueue->tail++ ;
	}
OUT :
	return ret ;
}
//-------删除数据 
int deleteData(FIFO * qQueue){
	int ret = 0 ;
	if(isEmpty(qQueue)){
		ret = -1 ;
		goto OUT ;
	}
	
	if(qQueue->head == MAX - 1){
		qQueue->queue[qQueue->head] = 0 ;
		qQueue->head = 0 ;
	}else{
		qQueue->queue[qQueue->head] = 0 ;
		qQueue->head++ ;
	}
OUT :	
	return ret ;
}
//-------提取数据 
int getData(FIFO * qQueue){
	int ret = 0 ;
	if(isEmpty(qQueue)){
		ret = -1 ;
		goto OUT ;
	}
	
	if(qQueue->head == MAX - 1){
		ret = qQueue->queue[qQueue->head] ;
		qQueue->queue[qQueue->head] = 0 ;
		qQueue->head = 0 ;
	}else{
		ret = qQueue->queue[qQueue->head] ;
		qQueue->queue[qQueue->head] = 0 ;
		qQueue->head++ ;
	}
OUT :
	return ret ;
}
//-------检查队列头 
int checkHead(FIFO * qQueue){
	int ret = 0 ;
	if(isEmpty(qQueue)){
		ret = -1 ;
		goto OUT ;
	}
	ret = qQueue->queue[qQueue->head] ;
OUT :
	return ret ;
}
//-----打印队列 
void prQueue(FIFO * qQueue){
	int i ;
	for(i = 0 ; i < MAX ; i ++){
		printf("%d " , qQueue->queue[i]) ;
	}
	printf("\n") ;
}

int main(){
	int ret = 0 ;
	FIFO * qQ = NULL;
	qQ = init() ;
	
	char input = 0 ;
	//gui demo
	while(1){
		printf("the queue is :") ;
		prQueue(qQ) ;
		printf("1.insert 2.delete 3.checkHead 4.init 5.exit\n") ;
		scanf("%c" , &input) ;
		fflush(stdin) ;
		switch(input){
			case '1' :
				int data ;
				data = 0 ;
				printf("input a data:") ;
				scanf("%d" , &data) ;
				fflush(stdin) ;
				printf("data is :%d\n" , data) ;
				ret = insertData(qQ , data) ;
				if(ret == 0){
					printf("insert success\n") ;
				}else{
					printf("queue is full\n") ;
				}
				prQueue(qQ) ;
				break ;
			case '2' :
				ret = deleteData(qQ) ;
				if(ret == 0){
					printf("delete successed\n") ;
				}else{
					printf("queue is empty\n") ;
				}
				prQueue(qQ) ;
				break ;
			case '3' :
				ret = checkHead(qQ) ;
				printf("the head is:%d\n" , ret) ;
				prQueue(qQ) ;
				break ;
			case '4' :
				free(qQ) ;
				qQ = init() ;
				prQueue(qQ) ;
				printf("init successed\n") ;
				break ;
			case '5' :
				printf("bye\n") ;
				ret = 0 ;
				goto OUT ;
				break ;
		}
		system("pause") ;
		system("cls") ;
	}
	
OUT :
	free(qQ) ;
	return ret ;
}
  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值