循环队列
循环队列更加的合理,节省内存和空间
为了能够在一定空间内完成循环队列,需要记录队列尾部的位置以及队列中成员数量,根据这两个可以计算出头的位置,从而完成循环队列。
02_queue.h
#ifndef _02_QUEUE__
#define _02_QUEUE__
typedef struct {
int buf[SIZE];
int tail; // last number + 1
int qty; // queue number
} queue_t;
void queue_init(queue_t * );
void queue_deinit(queue_t * );
int head_check(const queue_t *);
int queue_size(const queue_t *);
int queue_full(const queue_t *);
int queue_empty(const queue_t *);
int push(queue_t * ,int );
int pop(queue_t * , int *);
int top(queue_t *, int *);
#endif
02_queue.c
#include "02_queue.h"
void queue_init(queue_t * p_queue)
{
p_queue->qty = 0;
p_queue->tail = 0;
}
void queue_deinit(queue_t * p_queue)
{
p_queue->qty = 0;
p_queue->tail = 0;
}
int head_check(const queue_t *p_queue)
{
int head;
head = p_queue->tail - p_queue->qty ;
if (head < 0)
head=head + SIZE;
return head;
}
int queue_size(const queue_t *p_queue)
{
return p_queue->qty;
}
int queue_full(const queue_t *p_queue)
{
return p_queue->qty >= SIZE;
}
int queue_empty(const queue_t *p_queue)
{
return !p_queue->qty ;
}
int push(queue_t * p_queue,int val)
{
if (queue_full(p_queue))
{
return 0;
}
p_queue->buf[p_queue->tail] = val;
p_queue->tail++;
p_queue->qty++;
if (p_queue->tail >= SIZE)
p_queue->tail = 0;
return 1;
}
int pop(queue_t * p_queue, int *p_val)
{
if(queue_empty(p_queue))
return 0;
*p_val = p_queue->buf[head_check(p_queue)];
p_queue->qty--;
return 1;
}
int top(queue_t *p_queue, int *p_val)
{
if(queue_empty(p_queue))
return 0;
*p_val = p_queue->buf[head_check(p_queue)];
return 1;
}
02_queue_main.c
#include<stdio.h>
#include "02_queue.h"
int main()
{
queue_t que = {0};
int val = 0;
queue_init(&que);
printf("queue empty result is %d \n", queue_empty(&que));
printf("queue full result is %d \n", queue_full(&que));
printf("queue size result is %d \n", queue_size(&que));
push(&que, 10);
push(&que, 20);
push(&que, 15);
push(&que, 30);
push(&que, 45);
pop(&que,&val);
pop(&que,&val);
pop(&que,&val);
push(&que, 1);
push(&que, 50);
printf("queue head pos:%d tail pos:%d\n", head_check(&que), que.tail);
printf("queue empty result is %d \n", queue_empty(&que));
printf("queue full result is %d \n", queue_full(&que));
printf("queue size result is %d \n", queue_size(&que));
top(&que,&val);
printf("queue top val is %d \n ",val);
while(!queue_empty(&que))
{
pop(&que,&val);
printf("%d ", val);
}
printf("\n");
printf("queue empty result is %d \n", queue_empty(&que));
printf("queue full result is %d \n", queue_full(&que));
printf("queue size result is %d \n", queue_size(&que));
queue_deinit(&que);
return 0;
}
编译
gcc -DSIZE=5 02_queue_main.c 02_queue.c
运行结果:
queue empty result is 1
queue full result is 0
queue size result is 0
queue head pos:3 tail pos:2
queue empty result is 0
queue full result is 0
queue size result is 4
queue top val is 30
30 45 1 50
queue empty result is 1
queue full result is 0
queue size result is 0