队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,
而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。
进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。
故队列又称为先进先出(FIFO—first in first out)线性表。
2.队列的C实现
3.队列的C++实现
4.队列的Java实现
5.循环队列的实现
/**************************************************************************************
* Function : 模拟队列
* Create Date : 2014/04/23
* Author : NTSK13
* Email : beijiwei@qq.com
* Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性。
* 任何单位和个人不经本人允许不得用于商业用途
* Version : V0.1
***************************************************************************************
题目:简单数据结构之队列模拟
**************************************************************************************/
#include<stdio.h>
#define MY_FUNC 1
#if MY_FUNC
#define M 10 //队列最大长度
typedef struct queue
{
int data[M];
int len;//队列当前长度
}Queue;
int sample[M];
int result[M];
void init_queue(Queue *a);//队列初始化
int in_queue(Queue *a,int value);//进队
int out_queue(Queue *a);//出队
int get_head_element(Queue *a);//获取队首的元素
// The first method:
int main()
{
int i=0;
Queue sq;
init_queue(&sq);
freopen("input.txt","r",stdin);
for(i=0;i<M;i++)
scanf("%d",&sample[i]); // get input data
out_queue(&sq);
get_head_element(&sq);
for(i=0;i<M;i++)
in_queue(&sq,sample[i]);
in_queue(&sq,100);
for(i=0;i<M;i++)
result[i]=out_queue(&sq);
for(i=0;i<M;i++)
{
printf("%d\t",result[i]);
fflush(stdout);//修复Eclipse printf()不能显示的小bug
}
printf("\n");
fflush(stdout);
return (0);
}
void init_queue(Queue *a)//队列初始化
{
(*a).len=0;
}
//该种情况,进队效率太低
int in_queue(Queue *a,int value)//进队
{
int i=0;
if( (*a).len==M)
{
printf("Queue is full ,can not in !!!\n");
fflush(stdout);
return (-1);
}else{
if((*a).len==0)
{
(*a).data[0]=value;
(*a).len++;
return (1);
}else
{
for(i=(*a).len;i>0;i--)
{
(*a).data[i]=(*a).data[i-1];
}
(*a).data[0]=value;
(*a).len++;
return (1);
}
}
}
int out_queue(Queue *a)
{
int tmp=0;
if((*a).len==0)
{
printf("Queue is empty ,can not out !!!\n");
fflush(stdout);
return (-1);
}else{
tmp=(*a).len-1;
(*a).len--;
return ( (*a).data[tmp]);
}
}
int get_head_element(Queue *a)
{
if( (*a).len==0)
{
printf("Queue is empty full ,can not get !!!\n");
fflush(stdout);
return (-1);
}else{
return ( (*a).data[ (*a).len -1]);
}
}
/********************************************my function end**************************************************/
#else
#define M 10 //队列最大长度
typedef struct queue
{
int data[2*M-1];//队列最长为M
int head;
int tail;
int len;//队列当前长度
}Queue;
int sample[M];
int result[M];
void init_queue(Queue *a);//队列初始化
int in_queue(Queue *a,int value);//进队
int out_queue(Queue *a);//出队
int get_head_element(Queue *a);//获取队首的元素
// The second method:
int main()
{
int i=0;
Queue sq;
init_queue(&sq);
freopen("input.txt","r",stdin);
for(i=0;i<M;i++)
scanf("%d",&sample[i]); // get input data
out_queue(&sq);
get_head_element(&sq);
for(i=0;i<M;i++)
in_queue(&sq,sample[i]);
in_queue(&sq,100);
for(i=0;i<M;i++)
result[i]=out_queue(&sq);
for(i=0;i<M;i++)
{
printf("%d\t",result[i]);
fflush(stdout);//修复Eclipse printf()不能显示的小bug
}
printf("\n");
fflush(stdout);
return (0);
}
void init_queue(Queue *a)
{
(*a).len=0;
}
//这种方法 避免了 for 循环
int in_queue(Queue *a,int value)//进队
{
if( (*a).len==M)
{
printf("Queue is full ,can not in !!!\n");
fflush(stdout);
return (-1);
}else{
if((*a).len==0)
{
(*a).data[M]=value;
(*a).len++;
(*a).head=M;
(*a).tail=M;
return (1);
}else
{
if( (*a).tail ==0 )
(*a).tail=2*M-2;
else
(*a).tail--;
(*a).data[ (*a).tail]=value;
(*a).len++;
return (1);
}
}
}
int out_queue(Queue *a)
{
int tmp=0;
if((*a).len==0)
{
printf("Queue is empty ,can not out !!!\n");
fflush(stdout);
return (-1);
}else{
tmp=(*a).head;
if((*a).head==0)
(*a).head=2*M-2;
else
(*a).head--;
(*a).len--;
return ( (*a).data[tmp]);
}
}
int get_head_element(Queue *a)
{
if( (*a).len==0)
{
printf("Queue is empty full ,can not get !!!\n");
fflush(stdout);
return (-1);
}else{
return ( (*a).data[ (*a).head ]);
}
}
#endif