循环队列的入队,出队,求队长,取对头元素功能实现

目录

一、队列的定义

二 、真溢出与假溢出

 三、解决假溢出

四、注意

五、代码


一、队列的定义

      队列只能在一端插入,另一端删除,插入的一端叫队尾(rear),删除的一端叫队首(front)。 

      队列最大的特点就是先进先出,可以理解为在食堂排队打饭,第一个排队的最先在d出去。 

二 、真溢出与假溢出

      溢出就是队列满了,判断队空和队满的条件为:

队空:front=rear
队满:rear-front=maxsize

      当rear在队首,front在队尾时,也就是front指向0,rear指向4,此时队满,不能再入队列。这种情况是真溢出。

      当rear在队首,front在rear后一个时,也就是front指向3,rear指向4,此时虽然有队列中有空间,但也不能再入队列。这种情况是假溢出。

 三、解决假溢出

      将队列首尾相连,形成一个圆环,并且称这种队列为循环队列。

       圆环的情况下,队空时front=rear,队满时front=rear,两种情况就冲突了。

      此时需要牺牲一个空间,用于区别队空和队满。判断队空,队满的条件变为:

队空:front == rear
队满:(rear+1)%maxsize == front
当rear=5,front=0
(rear+1)%6=0=front,队满

四、注意

      在入队和出队时,front和rear不能单纯的只+1,要写为:

frount = (frount + 1) % maxsize
rear = (rear + 1) % maxsize

      这是为了保证front和rear指针能够正确的指示队列头尾元素在数组内的位置,需要在进行入队和出队操作时对 front和rear 进行加减1的操作。比如rear指向5时,如果再+1就指向了6,就错误了,如果+1再与maxsize(6)取余,成功指向0。

五、代码

#include<stdio.h>
#include<stdlib.h>
typedef struct sqqueue
{
	int* base;
	int frount;
	int rear;
}sqqueue;
//maxsize为10,数字更直观

//全局声明
sqqueue Q;

//创建队列
int createsqueue(sqqueue& Q)
{
	Q.base = (int*)malloc(sizeof(int) * 10);
	if (Q.base == NULL)
	{
		printf("分配内存失败!");
		exit(1);
	}
	Q.frount = Q.rear = 0;
	printf("创建成功!\n");
	return 0;
}

//入队列
int insqqueue(sqqueue& Q,int e)
{
	if ((Q.rear + 1) % 10 == Q.frount)
	{
		printf("队满!\n");
		exit(1);
	}
	Q.base[Q.rear] = e;
	printf("%d入队成功!\n", e);
	Q.rear = (Q.rear + 1) % 10;
	return 0;
}

//出队列
int outsqqueue(sqqueue& Q)
{
	if (Q.frount == Q.rear)
	{
		printf("队空!\n");
		exit(1);
	}
	int e = 0;
	e = Q.base[Q.frount];
	printf("%d出队成功!\n", e);//不是真正的删除数据,是另找一个空间存储他
	Q.frount = (Q.frount + 1) % 10;
	return 0;
}

//取队头元素
int gethead(sqqueue& Q)
{
	if (Q.frount == Q.rear)
	{
		printf("队空!");
		exit(1);
	}
	printf("队头元素为:%d\n",Q.base[Q.frount]);
	return 0;
}

//求队长
int queuelength(sqqueue& Q)
{
	printf("此时队长为:%d\n", Q.rear - Q.frount);
	return 0;
}

//菜单
void menu(void)
{
	printf("******************************\n");
	printf("***     1---创建队列      ****\n");
	printf("***     2---入队          ****\n");
	printf("***     3---出队          ****\n");
	printf("***     4---取对头元素    ****\n");
	printf("***     5---求队长        ****\n");
	printf("******************************\n");
}

//主函数
int main(void)
{
	int choice, e, t;
	menu();
	while (1)
	{
		printf("请选择功能:");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			t = createsqueue(Q);
			break;
		case 2:
			printf("请输入需要入队的数:");
			scanf("%d", &e);
			t = insqqueue(Q, e);
			break;
		case 3:
			t = outsqqueue(Q);
			break;
		case 4:
			t = gethead(Q);
			break;
		case 5:
			t = queuelength(Q);
			break;
		}
	}
	return 0;
}

  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
非常感谢您的提问。关于循环队列初始化、入队出队队头元素以及求队长的算法实现,我可以为您提供一些相关的代码示例和解释。以下是一个简单的循环队列实现: ```C++ #include <iostream> using namespace std; #define MAXSIZE 100 typedef struct { int data[MAXSIZE]; int front, rear; } Queue; void InitQueue(Queue& Q) { Q.front = Q.rear = 0; } bool QueueEmpty(Queue& Q) { return (Q.front == Q.rear); } bool QueueFull(Queue& Q) { return ((Q.rear + 1) % MAXSIZE == Q.front); } bool EnQueue(Queue& Q, int x) { if (QueueFull(Q)) { return false; } Q.data[Q.rear] = x; Q.rear = (Q.rear + 1) % MAXSIZE; return true; } bool DeQueue(Queue& Q, int& x) { if (QueueEmpty(Q)) { return false; } x = Q.data[Q.front]; Q.front = (Q.front + 1) % MAXSIZE; return true; } bool GetHead(Queue& Q, int& x) { if (QueueEmpty(Q)) { return false; } x = Q.data[Q.front]; return true; } int QueueLength(Queue& Q) { return (Q.rear - Q.front + MAXSIZE) % MAXSIZE; } int main() { Queue Q; InitQueue(Q); EnQueue(Q, 1); EnQueue(Q, 2); EnQueue(Q, 3); EnQueue(Q, 4); EnQueue(Q, 5); int x; DeQueue(Q, x); GetHead(Q, x); cout << "Length: " << QueueLength(Q) << endl; return 0; } ``` 在这个代码中,我们首先定义了一个结构体 `Queue` 来表示一个循环队列,其中包含一个大小为 `MAXSIZE` 的数组 `data` 和两个指针 `front` 和 `rear` 。`front` 表示队头指针,`rear` 表示队尾指针。这个队列可以容纳 `MAXSIZE-1` 个元素。 接着我们实现了五个操作: - `InitQueue` 用来初始化队列。 - `QueueEmpty` 判断队列是否为。 - `QueueFull` 判断队列是否已满。 - `EnQueue` 将元素入队。 - `DeQueue` 将元素从队列中出队。 - `GetHead` 获队头元素。 - `QueueLength` 获队列长度。 在 main 函数中,我们首先初始化队列,并依次将元素 1~5 入队。接着我们将队列中的第一个元素出队,并获当前队头的元素值。最后我们输出了当前队列的长度。 希望这个程序可以帮助到您。如有任何问题,请随时与我交流。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

脑子不好真君

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

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

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

打赏作者

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

抵扣说明:

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

余额充值