【Linux C编程】第二十七章 如何在 C 中实现循环队列?

举报
Yuchuan 发表于 2021/08/11 15:54:20 2021/08/11
【摘要】 C 中的循环队列以非常实用的方式存储数据。它是一种线性数据结构。它与队列非常相似。唯一的区别是最后一个节点连接回第一个节点。因此,它被称为循环队列。本文将帮助您详细探索这个概念。

C 中的循环队列以非常实用的方式存储数据。它是一种线性数据结构。它与队列非常相似。唯一的区别是最后一个节点连接回第一个节点。因此,它被称为循环队列。本文将帮助您详细探索这个概念。

本文将介绍以下指针,

C中的循环队列

循环队列解决了普通队列的局限性。 从而使其成为比普通队列更好的选择。它还遵循先到先服务算法。循环队列也称为环形缓冲区 

循环队列上的操作

  1. 入队 - 如果队列中有空间,则在队列中添加一个元素。
  2. Dequeue - 如果队列中有任何元素,则从队列中删除元素
  3. Front- 从队列中获取第一项。
  4. 重新获取队列中的最后一项。
  5. isEmpty/isFull- 检查队列是空还是满。

循环队列的应用

  • 内存管理:循环队列用于内存管理。
  • 进程调度:CPU 使用队列来调度进程。
  • 交通系统:队列也用于交通系统。

示例代码

#include<stdio.h>
# define MAX 5
int cqueue_arr[MAX];
int front = -1;
int rear = -1;
void insert(int item)
{
	if((front == 0 && rear == MAX-1) || (front == rear+1))
	{
		printf("Queue Overflow n");
		return;
	}
	if(front == -1)
	{
		front = 0;
		rear = 0;
	}
	else
	{
		if(rear == MAX-1)
			rear = 0;
			else
			rear = rear+1;
	}
	cqueue_arr[rear] = item ;
}

void deletion()
{
	if(front == -1)
	{
		printf("Queue Underflown");
		return ;
	}
	printf("Element deleted from queue is : %dn",cqueue_arr[front]);
	if(front == rear)
	{
		front = -1;
		rear=-1;
	}
	else
	{
		if(front == MAX-1)
			front = 0;
		else
			front = front+1;
	}
}

void display()
{
	int front_pos = front,rear_pos = rear;
	if(front == -1)
	{
		printf("Queue is emptyn");
		return;
	}
	printf("Queue elements :n");
	if( front_pos <= rear_pos )
		while(front_pos <= rear_pos)
		{
			printf("%d ",cqueue_arr[front_pos]);
			front_pos++;
		}
	else
	{
		while(front_pos <= MAX-1)
		{
			printf("%d ",cqueue_arr[front_pos])
			front_pos++;
		}
		front_pos = 0;
		while(front_pos <= rear_pos)
		{
			printf("%d ",cqueue_arr[front_pos]);
			front_pos++;
		}
	}
	printf("n");
}

int main()
{
	int choice,item;
	do
	{
		printf("1.Insertn");
		printf("2.Deleten");
		printf("3.Displayn");
		printf("4.Quitn");
		printf("Enter your choice : ");
		scanf("%d",&choice);
		switch(choice)
		{
			case 1 :
			printf("Input the element for insertion in queue : ");
			scanf("%d", &item);
			insert(item);
			break;
			case 2 :
			deletion();
			break;
			case 3:
			display();
			break;
			case 4:
			break;
			default:
			printf("Wrong choicen");
		}
	}while(choice!=4);
	return 0;
}

Output:

Circular queue code

Explanation

此代码是循环队列的菜单驱动实现。首先,定义 MAX 变量的大小为 5。然后,声明名为 cqueue_array 的数组的大小为 MAX。需要声明三个函数。功能是插入、显示和删除功能。有一个菜单驱动的主要功能。要求用户输入他的选择并调用适当的函数来执行任务。

有2个指针,前面在队列的前面,后面在队列的后面。在循环队列中,元素从队列后面添加,从队列前面删除。这是循环队列,所以如果后部在最后一个位置,如果增加它将指向第一个元素

继续这篇关于 C 中的循环队列的文章

插入功能

void insert(int item)
{
	if((front == 0 && rear == MAX-1) || (front == rear+1))
	{
		printf("Queue Overflow n");
		return;
	}
	if(front == -1)
	{
		front = 0;
		rear = 0;
	}
	else
	{
		if(rear == MAX-1)
			rear = 0;
			else
			rear = rear+1;
	}
	cqueue_arr[rear] = item ;
}

在插入部分,检查循环队列是否已满,如果是则给出溢出消息,否则检查循环队列是否为空。如果后部位于最后一个位置,则将其指向第一个位置,否则后部将加一。这就是它变成循环队列的方式。最后,项目进入队列。

继续这篇关于 C 中的循环队列的文章

删除功能

void deletion()
{
	if(front == -1)
	{
		printf("Queue Underflown");
		return;
	}
	printf("Element deleted from queue is : %dn",cqueue_arr[front]);
	if(front == rear)
	{
		front = -1;
		rear=-1;
	}
	else
	{
		if(front == MAX-1)
			front = 0;
			else
			front = front+1;
	}
}

在删除部分,首先检查循环队列是否为空。如果是,则打印下溢错误,即队列为空。否则打印第一个元素,即将被删除并增加前面的元素。这就是删除发生的方式。

然后,检查前后是否指向同一位置并将两个值都分配为 -1,即不指向任何地方。否则,检查前端是否在末尾,如果是,则使其指向第一个位置。否则,增加前面。

继续这篇关于 C 中的循环队列的文章

Display Function

void display()
{
	int front_pos = front,rear_pos = rear;
	if(front == -1)
	{
		printf("Queue is emptyn");
		return;
	}
	printf("Queue elements :n");
	if( front_pos <= rear_pos )
		while(front_pos <= rear_pos)
		{
			printf("%d ",cqueue_arr[front_pos]);
			front_pos++;
		}
	else
	{
		while(front_pos <= MAX-1)
		{
			printf("%d ",cqueue_arr[front_pos]);
			front_pos++;
		}
		front_pos = 0;
		while(front_pos <= rear_pos)
		{
			printf("%d ",cqueue_arr[front_pos]);
			front_pos++;
		}
	}
	printf("n");
}

我们只是像显示数组一样显示循环队列。检查循环队列是否也在这里为空。然后,根据变量front和rear的位置打印循环队列的元素。

这篇关于 C 中的循环队列的文章到此结束。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。