简单数据结构之队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,

而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。


进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。


队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。


因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,

故队列又称为先进先出(FIFO—first in first out)线性表。


1.数组模拟队列
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  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值