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; 

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM