用循环数组实现队列的方法

用数组实现表的方法可用于实现队列,但这样做的效果并不好。尽管可以用一个游标来指示队尾,使得EnterQueue运算在O(1)时间内完成,但是在执行DeleteQueue时,为了删除队首元素,必须将数组中其他元素都向前移动一个位置。这样队列中有n个元素时,执行DeleteQueue就需要n的时间。

为了提高运算的效率,采用另一种观点来处理数组中各单元的位置关系。设想数组queue[0:maxsize-1]中的单元不是排成一排,而是围成一个环,即queue[0]接在queue[maxsize-1]的后面。这种意义下的数组称为循环数组

#include<stdio.h>
#include<stdlib.h>
typedef struct aque*Queue;
typedef struct aque
{
	int maxsize;
	int front;
	int rear;
	int *queue;  //循环数组
}Aqueue;
//*******************************
//初始化
Queue QueueInit(int size)
{
	Queue Q;
	Q=(Queue)malloc(sizeof(Aqueue));
	Q->queue=(int*)malloc(sizeof(int)*size);
	Q->front=Q->rear=0;
	Q->maxsize=size;
	return Q;
}
//*******************************
//判断队列是否为空
int QueueEmpty(Queue Q)
{
	return Q->front==Q->rear;
}
//*******************************
//判断队列是否为满
int QueueFull(Queue Q)
{
	return (Q->rear+1)%Q->maxsize==Q->front;
}
//*******************************
//返回队列队首的值
int QueueFirst(Queue Q)
{
	if(QueueEmpty(Q))
	{
		printf("queue is empty");
		exit(0);
	}
	return Q->queue[(Q->front+1)%Q->maxsize];
}
//*******************************
//返回队列队尾的值
int QueueLast(Queue Q)
{
	if(QueueEmpty(Q))
	{
		printf("queue is empty");
		exit(0);
	}
	return Q->queue[Q->rear];
}
//*******************************
//新元素入队列
void EnterQueue(int x,Queue Q)
{
	if(QueueFull(Q))
	{
		printf("queue is full");
		exit(0);
	}
	Q->rear=(Q->rear+1)%Q->maxsize;
	Q->queue[Q->rear]=x;
}
//删除队首元素
int DeleteQueue(Queue Q)
{
	if(QueueEmpty(Q))
	{
		printf("queue is empty");
		exit(0);
	}
	Q->front=(Q->front+1)%Q->maxsize;
	return Q->queue[Q->front];

}
int main()
{
	Queue Q;
	int size=20;
	Q=QueueInit(size);
	for(int i=1;i<=10;i++)
		EnterQueue(i,Q);
	for(i=1;i<=10;i++)
		printf("%d ",DeleteQueue(Q));

	return 0;
	
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用一个长度为10的数组实现队列,可以定义两个指针 front 和 rear 分别指向队列的头和尾。初始时,front 和 rear 都指向数组的第一个位置。队列的长度为0。 当有元素入队时,将元素插入到 rear 指向的位置,并将 rear 向后移动一个位置。如果 rear 超出了数组的范围,那么队列就满了,不能再插入元素了。 当有元素出队时,将 front 指向的元素弹出,并将 front 向后移动一个位置。如果 front 超出了数组的范围,那么队列就为空,不能再弹出元素了。 具体实现细节可以参考下面的代码: ```python class Queue: def __init__(self): self.array = [None] * 10 self.front = 0 self.rear = 0 def is_empty(self): return self.front == self.rear def is_full(self): return (self.rear + 1) % len(self.array) == self.front def enqueue(self, element): if self.is_full(): raise Exception('Queue is full') self.array[self.rear] = element self.rear = (self.rear + 1) % len(self.array) def dequeue(self): if self.is_empty(): raise Exception('Queue is empty') element = self.array[self.front] self.front = (self.front + 1) % len(self.array) return element ``` 在这个实现中,我们使用取模运算来实现循环队列。当 rear 超出数组的范围时,将 rear 的值重新赋为 0,表示下一个元素将插入到数组的第一个位置。同理,当 front 超出数组的范围时,将 front 的值重新赋为 0,表示下一个元素将弹出数组的第一个位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值