数据结构10-循环队列

        循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列结构中,当存储空间的最后一个位置已被使用而再要进入队运算时,只需要存储空间的第一个位置空闲,便可将元素加入到第一个位置,即将存储空间的第一个位置作为队尾。

        为了区别这空和满时都有head=tail,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件是head=tail,而队列判满的条件是head=(tail+1)%MaxSize。 

完整代码

#include <stdio.h>
#include <malloc.h>

#define MAXSIZE 5

typedef struct CircleIntQueue{
	int data[MAXSIZE];
	int head;
	int tail;
}*CircleIntQueuePtr;

CircleIntQueuePtr iniQueue(){
	CircleIntQueuePtr result = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
	result->head = 0;
	result->tail = 0;
	return result;
}

void enqueue(CircleIntQueuePtr pPtr,int pValue){
	if((pPtr->tail + 1) % MAXSIZE == pPtr->head){
		printf("Queue full.\n");
		return;
	}
	
	pPtr->data[pPtr->tail % MAXSIZE] = pValue;
	pPtr->tail++;
}

int dequeue(CircleIntQueuePtr pPtr){
	int result;
	if(pPtr->head == pPtr->tail){
		printf("No element in the queue.\n");
		return 0;
	}
	
	result = pPtr->data[pPtr->head % MAXSIZE];
	pPtr->head++;
	
	return result;
}

void printCircleQueue(CircleIntQueuePtr pPtr){
	int i;
	if(pPtr->head == pPtr->tail){
		printf("Empty queue.");
		return;
	}
	
	printf("Element in the queue:");
	for(i = pPtr->head;i < pPtr->tail;i ++){
		printf("%d,",pPtr->data[i % MAXSIZE]);
	}
	printf("\n");
}

void testCircleQueue(){
	int i = 10;
	CircleIntQueuePtr temp = iniQueue();
	for(;i < 16; i++){
		enqueue(temp,i);
	}
	
	printCircleQueue(temp);
	
	for(i = 0;i < 6;i ++){
		printf("dequeue gets %d\n",dequeue(temp));
	}
	
	enqueue(temp,8);
	printCircleQueue(temp);
}

int main(){
	testCircleQueue();
	return 0;
}

运行结果

Queue full.
Queue full.
Element in the queue:10,11,12,13,
dequeue gets 10
dequeue gets 11
dequeue gets 12
dequeue gets 13
No element in the queue.
dequeue gets 0
No element in the queue.
dequeue gets 0
Element in the queue:8,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值