欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用C语言实现FIFO

程序员文章站 2022-03-14 15:56:20
...

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

#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 damo
	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 ;
}