C语言队列-先进先出

这里我们介绍两种队列的形式,

   第一种队列当数据插入到文件的最后,就认为这个文件已经满,将不再插入数据,这里使用head 和 tail表示要插入和提取的数据位置

queue队列的声明文件 02queue.h

/*
queue队列
*/ 
#include <stdio.h>

#ifndef __O2QUEUE_H__
#define __02QUEUE_H__ 
typedef struct {
    int buf[SIZE]; 
    int head; 
    int tail; 
} queue; 

void queue_init(queue *);

void queue_deinit(queue *);

int queue_size(queue *);

int queue_empty(queue *);

int queue_full(queue *);

int queue_push(queue *, int);

int queue_pop(queue *, int *);

int queue_top(queue *, int *);

#endif 

queue队列的02queue.c文件

/*
queue队列
*/ 
#include "02queue.h"

void queue_init(queue *p_queue) {
    p_queue->head = 0; 
    p_queue->tail = 0; 
}

void queue_deinit(queue *p_queue) {
    p_queue->head = 0; 
    p_queue->tail = 0; 
}

int queue_size(queue *p_queue) {
    return p_queue->tail - p_queue->head; 
}

int queue_empty(queue *p_queue) {
    return !(p_queue->tail - p_queue->head); 
}

int queue_full(queue *p_queue) {
    return p_queue->tail >= SIZE; 
}

int queue_push(queue *p_queue, int val) {
    if (p_queue->tail >= SIZE) {
        return -1; 
    }
    p_queue->buf[p_queue->tail] = val; 
    p_queue->tail++;
    return 0; 
}

int queue_pop(queue *p_queue, int *p_val) {
    if (p_queue->tail == p_queue->head){
        return -1; 
    }
    *p_val = p_queue->buf[p_queue->head]; 
    p_queue->head++; 
    return 0;  
}

int queue_top(queue *p_queue, int *p_val) {
    if (p_queue->tail == p_queue->head){
        return -1; 
    }
    *p_val = p_queue->buf[p_queue->head]; 
    return 0;
}

queue队列的 02main_queue.c队列文件

/*
queue队列主函数
*/ 
#include <stdio.h>
#include <stdlib.h>
#include "02queue.h"
int main() {
    int val = 0; 
    queue q = {0}; 
    queue_init(&q); 
    queue_push(&q, 20); 
    queue_push(&q, 30); 
    printf("队列的大小是%d\n", queue_size(&q)); 
    printf("队列是否为空 %d\n", queue_empty(&q)); 
    printf("队列是否为满 %d\n", queue_full(&q)); 
    queue_pop(&q, &val); 
    printf("抽取的数据是%d\n", val); 
    printf("队列的大小是%d\n", queue_size(&q)); 
    queue_top(&q, &val); 
    printf("抽取的数据是%d\n", val); 
    printf("队列的大小是%d\n", queue_size(&q)); 
    queue_deinit(&q); 

}

第二种方式 相当于是一块内存位置在上面进行移动,当最后位置存在数时,可以通过插入位置变成0,插入到位置为0的位置,重新开始插入,直到所有的位置都有数,这里使用qty和tail作为变量

03loop_queue.h

/*
循环队列
*/
#ifndef __03LOOP_QUEUE_H__ 
#define __03LOOP_QUEUE_H__


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

typedef struct {
    int buf[SIZE]; 
    int qty; 
    int tail;     

} queue; 


int get_head(queue* );

//进行队列的初始化
void queue_init(queue* );
//进行队列内容的删除 
void queue_deinit(queue* ); 
//获得队列的尺寸
int queue_size(queue* ); 
//判断队列是否为空
int queue_empty(queue* );
//判断队列是否为满 
int queue_full(queue* );
//在队列里进行插入 
int queue_push(queue* , int );

int queue_pop(queue* p_queue, int* p_val);

int queue_top(queue* p_queue, int* p_val);

#endif 

03queue_loop.c

/*
循环队列
*/ 

#include "03loop_queue.h"

int get_head(queue* p_queue) {
    if(p_queue->tail >= p_queue->qty) {
        return p_queue->tail - p_queue->qty; 
    }
    return SIZE - (p_queue->qty - p_queue->tail); 
} 

//进行队列的初始化
void queue_init(queue* p_queue) {
    p_queue->qty = 0; 
    p_queue->tail = 0; 
}
//进行队列内容的删除 
void queue_deinit(queue* p_queue) {
    p_queue->qty = 0; 
    p_queue->tail = 0; 
}
//获得队列的尺寸
int queue_size(queue* p_queue) {
    return p_queue->qty; 
}
//判断队列是否为空
int queue_empty(queue* p_queue) {
    return (!p_queue->qty); 
}
//判断队列是否为满 
int queue_full(queue* p_queue) {
    return (p_queue->qty == SIZE); 
}
//在队列里进行插入 
int queue_push(queue* p_queue, int val) {
    if (p_queue->qty == SIZE) {
        return -1; 
    }
    if (p_queue->tail == SIZE) {
        p_queue->tail = 0; 
    }
    p_queue->buf[p_queue->tail] = val; 
    p_queue->tail++; \
    p_queue->qty++; 
    return 0; 
}

int queue_pop(queue* p_queue, int* p_val) {
    if (!p_queue->qty) {    
        return -1; 
    }
    *p_val = p_queue->buf[get_head(p_queue)];
    p_queue->qty--; 
    return 0;  
}

int queue_top(queue* p_queue, int* p_val) {
    if (!p_queue->qty) {
        return -1; 
    }
    *p_val = p_queue->buf[get_head(p_queue)];
    return 0; 
}

03main_loop.c

/*
循环队列的主函数
*/ 
#include <stdio.h>
#include "03loop_queue.h"
int main(void){
    queue q = {0}; 
    int val = 0; 
    queue_init(&q);
    queue_push(&q, 1); 
    queue_push(&q, 2); 
    printf("队列是否为空 %d\n", queue_empty(&q)); 
    printf("队列是否为满 %d\n", queue_full(&q)); 
    printf("队列大小是 %d\n", queue_size(&q)); 
    queue_pop(&q, &val); 
    printf("获取的数据是%d\n", val); 
    printf("队列大小是 %d\n", queue_size(&q)); 
    queue_top(&q, &val); 
    printf("获取的数据是%d\n", val); 
    printf("队列大小是 %d\n", queue_size(&q)); 
    queue_deinit(&q); 
    return 0; 

}

 

posted @ 2020-03-27 09:10  c语言我的最爱  阅读(1617)  评论(0编辑  收藏  举报