数据结构之队列

基本概念

队列:和栈都是线性结构
区别:限制插入删除的位置与顺序表、链表、栈不同
特点:队尾插入、队头删除
这里主要实现用的最多的循环队列(实际上还是使用的一位数组)


循环队列的实现(C语言)

  • 循环队列的结构定义

typedef int  ElemType;

typedef struct Queue  //循环队列定义
{
	ElemType  *data; //指向队列空间的指针
	int        head; //队头指针
	int        rear; //队尾指针
	int        size;  //队列空间大小
}Queue;

  • 循环队列的函数声明
    与栈类似,队列的常见操作也就是初始化、入队、出队、取队头元素、判空、销毁这些操作
void InitQueue(Queue *que, int init_size);

Bool Empty(Queue *que);

Bool Push(Queue *que, ElemType value);

Bool Pop(Queue *que);

Bool Top(Queue *que, ElemType *reval);

void DestroyQueue(Queue *que);
  • 循环队列函数的实现
#define true TRUE;
#define false FALSE;

static Bool Full(Queue *que)
{
	if((que->rear+1) % que->size == que->head)
		return TRUE;

	return FALSE;
}

static Bool AppendSpace(Queue *que)
{
	ElemType *new_space = (ElemType *)malloc(sizeof(ElemType) * que->size * 2);
	if(new_space == NULL)  return FALSE;

	// 挪数据
	int i=que->head;
	for(;(i % que->size )< que->rear ;i++)
	{
		new_space[i]=que->data[i];
	}
/*
	int index=0;
	while(que->head !=que->rear )
	{
		new_space[index++]=que->data[que->head ];
		que->head=que->head % que->size ;
	}*/

	que->head =0;
	que->rear =que->size -1; //que->rear=que->size -1,因为是留了一个没用的所以是10个用9个
	
	free(que->data);
	que->data = new_space;
	que->size *= 2;
	return TRUE;
}

void InitQueue(Queue *que, int init_size)
{
	if(que == NULL) exit(0);

	init_size =init_size>0 ? init_size : 10 ;  

	que->data =(ElemType*)malloc(sizeof(ElemType)* init_size); 
	if(que->data == NULL)  exit(0);

	que->head = que->rear = 0;
	que->size = init_size;
}

Bool Empty(Queue *que)
{
	if(que == NULL) exit(0);

	if(que->head == que->rear)  return TRUE;
	return FALSE;
}
Bool Push(Queue *que, ElemType value)
{
	if(que == NULL) exit(0);

	if(Full(que))
	{
		if(!AppendSpace(que))
		{
			return FALSE;
		}
	}

	que->data[que->rear]=value;
	que->rear +=1;
	que->rear %=que->size ;
	return TRUE;
}

Bool Pop(Queue *que)
{
	if(que == NULL) exit(0);

	if(Empty(que)) return FALSE;

	que->head += 1;
	que->head %= que->size;
	return TRUE;
}

Bool Top(Queue *que, ElemType *reval)
{
	if(que == NULL) exit(0);

	if(Empty(que)) return FALSE;

	*reval = que->data[que->head ];
	return TRUE;
}

void DestroyQueue(Queue *que)
{
	if(que == NULL)  exit(0);

	free(que->data);
	que->data = NULL;
	que->head = que->rear = que->size = 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值