队列
- 先进先出(FIFO,First In First Out)
- 只允许从一端插入一端删除,称作 入队 和 出队 操作。
代码实例
queue.h
#ifndef __STACK_H
#define __STACK_H
#define MAX_SIZE 1024
typedef struct QUEUE
{
void* pData[MAX_SIZE];
int size;
int head;
int tail;
}Queue;
Queue* Init_Queue(void);
void Push_Queue(Queue* queue,void* data);
void Pop_Queue(Queue* queue);
void* Top_Queue(Queue* queue);
void* Tail_Queue(Queue* queue);
void Clear_Queue(Queue* queue);
void Free_Queue(Queue* queue);
int Size_Queue(Queue* queue);
#endif
queue.c
#include "../include/queue.h"
#include <stdlib.h>
Queue* Init_Queue(void)
{
Queue* queue = (Queue*)malloc(sizeof(Queue));
queue->size = 0;
queue->head = 0;
queue->tail = 0;
return queue;
}
void Push_Queue(Queue* queue,void* data)
{
if(queue == NULL) return;
if(data == NULL) return;
if(queue->size == MAX_SIZE) return;
queue->pData[queue->tail] = data;
queue->tail++;
queue->size++;
}
void Pop_Queue(Queue* queue)
{
if(queue == NULL)return;
if(queue->size == 0) return;
queue->head++;
queue->size--;
}
void* Top_Queue(Queue* queue)
{
if(queue == NULL)
return NULL;
if(queue->size == 0)
return NULL;
return queue->pData[queue->head];
}
void* Tail_Queue(Queue* queue)
{
if(queue == NULL)
return NULL;
if(queue->size == 0)
return NULL;
return queue->pData[queue->tail-1];//tail是没有元素的,tail-1是最后一个
}
void Clear_Queue(Queue* queue)
{
if(queue == NULL)
return;
queue->size=0;
queue->head=0;
queue->tail=0;
}
void Free_Queue(Queue* queue)
{
if(queue == NULL)
return;
free(queue);
}
int Size_Queue(Queue* queue)
{
if(queue == NULL) return -1;
return queue->size;
}
main.c
#include <stdio.h>
#include <string.h>
#include "../include/queue.h"
typedef struct PERSION
{
char name [64];
int id;
}Person;
int main(void)
{
Queue* queue=Init_Queue();
Person p1,p2,p3,p4;
strcpy(p1.name,"julian");
strcpy(p2.name,"july");
strcpy(p3.name,"mike");
strcpy(p4.name,"kerr");
p1.id = 1;
p2.id = 2;
p3.id = 3;
p4.id = 4;
//插入四个Person 的地址
Push_Queue(queue,&p1);
printf("Push %s %d\n",p1.name,p1.id);
Push_Queue(queue,&p2);
printf("Push %s %d\n",p2.name,p2.id);
Push_Queue(queue,&p3);
printf("Push %s %d\n",p3.name,p3.id);
Push_Queue(queue,&p4);
printf("Push %s %d\n",p4.name,p4.id);
printf("Queue size: %d \n\n",queue->size);
printf("开始Pop\n");
//四个元素出队
while(queue->size)
{
Person* p =(Person*) Top_Queue(queue);
printf("%s %d\n",p->name,p->id);
Pop_Queue(queue);
}
printf("after pop 4 times size: %d \n\n",queue->size);
//再插入两个元素地址
Push_Queue(queue,&p3);
printf("Push %s %d\n",p3.name,p3.id);
Push_Queue(queue,&p4);
printf("Push %s %d\n",p4.name,p4.id);
//返回 top 和 tail 的元素,打印
Person* p99 = (Person*)Top_Queue(queue);
Person* p100 = (Person*)Tail_Queue(queue);
printf("Top:%s %d\n",p99->name,p99->id);
printf("Tail:%s %d\n",p100->name,p100->id);
printf("this times size: %d \n",queue->size);
Free_Queue(queue);
return 0;
}
结果: