用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 ;
}