关于循环队列的入队、出队、遍历的操作

本文详细介绍了如何使用C语言实现环形队列,并提供了队列的基本操作,包括初始化、插入、删除、打印和获取队列长度。通过具体代码示例,读者可以了解环形队列的工作原理及其在内存分配上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include"stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
//定义队列结构
typedef struct Queue
{
	int *data;
	int rear;
	int front;
}squeue;
//初始化100个数字的队列
void Initqueue(squeue *q)
{
	q->data=(int *)malloc(MAX*sizeof(int));
	q->front=q->rear=0;
}
//返回队列长度
void queueL(squeue *q)
{
	printf("此队列的长度为:%d\n",(q->rear-q->front+MAX)%MAX);
}
//插入结点(入队)
void Insert(squeue *q,int e)
{
	if((q->rear+1)%MAX==q->front)
		printf("队列已满!\n");
	else
	{
		q->data[q->rear]=e;
		q->rear=(q->rear+1)%MAX;
	}
}
//删除结点(出队)
void Delete(squeue *q)
{
	if(q->rear==q->front)
		printf("队列已空!\n");
	else
	{
		q->front=(q->front+1)%MAX;
		printf("出队/删除 成功!\n");
	}
}
//打印(遍历)队列
void Print(squeue q)
{
	printf("________________________________________________________\n");
	while(q.front!=q.rear)
	{
		printf("%d ",q.data[q.front]);
		q.front=(q.front+1)%MAX;
	}
	printf("\n________________________________________________________\n");
}


int main()
{
	squeue l;
	int i,n,x,e;
	Initqueue(&l);//初始化队列
	while(1)
	{
		printf("\n***********************************************");
		printf("\n    1.建立队列");
		printf("\n    2.打印队列");
		printf("\n    3.入队");
		printf("\n    4.出队");
		printf("\n    0.退出");
		printf("\n***********************************************");
		printf("\n请输入操作数:");
		scanf("%d",&n);
		switch(n)
		{
		case 0:
			return 0;
		case 1:
			Initqueue(&l);
			printf("\n请输入队列长度:");
			scanf("%d",&x);
			for(i=1;i<=x;i++)
			{
				printf("\n请输入第%d个结点值:",i);
				scanf("%d",&e);
				Insert(&l,e);
			}
			printf("\n操作成功!");
			break;
		case 2:
			Print(l);
			break;
		case 3:
			printf("\n请输入需要入队的值:");
			scanf("%d",&e);
			Insert(&l,e);
			Print(l);
			break;
		case 4:
			Delete(&l);
			Print(l);
			break;
		default:
			printf("\n您的输入有误!");
			break;
		}
	}
}

循环队列是一种特殊的线性表数据结构,它通过将队列的头部尾部相连,使得当队列满时,新的元素添加到尾部,而旧的元素从头部删除,形成一种“头进尾出”的循环效果。在数组中实现循环队列,通常涉及到以下操作: 1. **队列长度**:在循环队列中,计算长度时需要注意边界条件。如果你有一个固定大小的数组作为队列容器,你可以维护两个指针:`front`表示队首元素的下一个位置,`rear`表示最后一个添加元素的位置。如果`rear - front`超过数组大小减一(因为`front == rear`时,表示队列为空),则实际队列长度为`(array_size - (front - rear)) % array_size`。 2. **入队(enqueue)**:当有新元素需要加入时,先检查队列是否已满。若未满,则将新元素放在`rear`位置,并更新`rear`指针。如果已满,则移动`front`指针,直到找到空位。 3. **出队(dequeue)**:取队首元素时,同样判断队列是否为空。非空则返回`front`处的元素,然后将`front`向后移动一位;如果队列为空,直接返回特殊值(如`None`)。 4. **遍历**:可以通过一个for循环或while循环,从`front`开始逐个访问每个元素,直到遇到`front == rear`的情况。 5. **取队头(peek)**:队头是指当前队列中第一个元素,但是不会移除它。所以队头位置是`front`,可以直接读取,不需要特殊处理。 下面是Python代码示例: ```python class CircularQueue: def __init__(self, capacity): self.queue = [0] * capacity self.front = -1 self.rear = -1 # 添加元素 def enqueue(self, value): if self.is_full(): return False if self.is_empty(): self.front = 0 else: self.rear = (self.rear + 1) % len(self.queue) self.queue[self.rear] = value return True # 删除元素 def dequeue(self): if self.is_empty(): return None removed_value = self.queue[self.front] if self.front == self.rear: self.front = self.rear = -1 else: self.front = (self.front + 1) % len(self.queue) return removed_value # 返回队列长度 def length(self): if self.is_empty(): return 0 elif self.front > self.rear: return len(self.queue) - (self.front - self.rear) else: return self.rear - self.front + 1 # 判断队列是否为空 def is_empty(self): return self.front == -1 # 判断队列是否已满 def is_full(self): return self.length() == len(self.queue) # 使用示例 cq = CircularQueue(5) cq.enqueue(1) cq.enqueue(2) print(cq.dequeue()) # 输出:1 print(cq.length()) # 输出:1 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韓豆豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值