队列是一种常用的数据结构,它跟栈一样,操作都受到限制,队列只允许从一端进数据,另一端出数据。队列跟栈不同,栈是一种“后进先出”的模式,而队列是一种“先进先出”的操作模式。就好比日常排队一样,先排队的先出,后排队的后出。例如,进入队列的顺序是1,2,3,4,5则出队列的顺序是1,2,3,4,5(只考虑一次性出列的情况)。

    队列也分顺序队列和链式队列,跟顺序栈和链表栈一样,顺序队列同样是基于数组实现,链式队列则是基于链表实现。

顺序队列:

//顺序队列

#include <stdio.h>
#define SIZE 10
typedef struct Queue
{
int data[SIZE];
int front;
int tail;
}Queue;
//初始化队列
void init_queue(Queue* qu)
{
qu->front=0;
qu->tail=-1;
}
//判断队列是否为满
int is_queue_empty(Queue* qu)
{
if(qu->tail==-1)
{
return 1;
}
return 0;
}
//判断队列是否为满
int is_queue_full(Queue* qu)
{
if(qu->tail==SIZE-1)
{
return 1;
}
return 0;
}
//获取队首值
int get_topvalue(Queue* qu)
{
if(is_queue_empty(qu))
{
printf("Queue is empty!\n");
return -1;
}
return qu->data[qu->front];
}
//进队列
void in_queue(Queue* qu,int _data)
{
if(is_queue_full(qu))
{
printf("Queue is full!\n");
return ;
}
qu->tail++;
qu->data[qu->tail]=_data;
}
int out_queue(Queue* qu)
{
if(is_queue_empty(qu))
{
printf("Queue is empty!\n");
return -1;
}
int ret_value=qu->data[qu->front];
int i;
for(i=0;i<qu->tail;i++)
{
qu->data[i]=qu->data[i+1];
}
qu->tail--;
return ret_value;
}
//打印队列内的元素
void print_queue(Queue* qu)
{
int i;
for(i=0;i<qu->tail+1;i++)
{
printf("%d\t",qu->data[i]);
}
printf("\n");
}
int main(int argc, char const *argv[])
{
Queue qu;
init_queue(&qu);
in_queue(&qu,1);
in_queue(&qu,23);
in_queue(&qu,5);
in_queue(&qu,3);
in_queue(&qu,6);
printf("get_topvalue:%d\n",get_topvalue(&qu));
//out_queue(&qu);
//print_queue(&qu);
int i;
for(i=0;i<7;i++)
{
printf("%d\t",out_queue(&qu));
}
printf("\n");
return 0;
}

链式队列:

//链式队列
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
	int data;
	struct Node* next;
}Node;
typedef struct Queue
{
	Node* front;
	Node* tail;
}Queue;
//初始化队列
void init_queue(Queue* qu)
{
	qu->front=NULL;
	qu->tail=NULL;
}
//判断队列是否为空
int is_queue_empty(Queue* qu)
{
	if(qu->front==NULL)
	{
		return 1;
	}
	return 0;
}
//获取队首值
int get_front_value(Queue* qu)
{
	if(is_queue_empty(qu))
	{
		printf("Queue is empty!\n");
		return -1;
	}
	return qu->front->data;
}
//入列
void in_queue(Queue* qu,int _data)
{
	Node* newnode=(Node*)malloc(1*sizeof(Node));
	newnode->data=_data;
	newnode->next=NULL;
	if(qu->front==NULL && qu->tail==NULL)
	{
		qu->front=newnode;
		qu->tail=newnode;
	}
	else
	{
		qu->tail->next=newnode;
		qu->tail=newnode;
	}
}
//出列
void out_queue(Queue* qu)
{
	if(is_queue_empty(qu))
	{
		printf("Queue is empty!\n");
		return;
	}
	Node* temp=qu->front;
	qu->front=qu->front->next;
	if(qu->front==NULL)
	{
		qu->tail=NULL;
	}
	free(temp);
	temp=NULL;
}
//打印队列中的值
void print_queue(Queue* qu)
{
	Node* curr=qu->front;
	while(curr)
	{
		printf("%d\t",curr->data);
		curr=curr->next;
	}
	printf("\n");
}
int main(int argc, char const *argv[])
{
	Queue qu;
	init_queue(&qu);
	int i;
	for(i=0;i<10;i++)
	{
		in_queue(&qu,i*2);
	}
	print_queue(&qu);
	printf("get_front_value:%d\n",get_front_value(&qu));
	out_queue(&qu);
	print_queue(&qu);
	printf("get_front_value:%d\n",get_front_value(&qu));
	return 0;
}